All Projects → tuffnatty → xsd_to_django_model

tuffnatty / xsd_to_django_model

Licence: GPL-3.0 license
Generate Django models from an XSD schema description (and a bunch of hints)

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to xsd to django model

django-bulk-sync
Combine bulk add, update, and delete into a single call.
Stars: ✭ 46 (+130%)
Mutual labels:  django-orm
xsd-reader
Pure PHP XSD Reader (XML Schema)
Stars: ✭ 45 (+125%)
Mutual labels:  xsd
django-concurrency-talk
🎭 Database Integrity in Django: Safely Handling Critical Data in Distributed Systems
Stars: ✭ 49 (+145%)
Mutual labels:  django-orm
jsons2xsd
Highly configurable converter from JSON-schema to XML-schema (XSD).
Stars: ✭ 65 (+225%)
Mutual labels:  xsd
xrechnung-visualization
XSL transformators for web and pdf rendering of German CIUS XRechnung or EN16931-1:2017 [MIRROR OF GitLab]
Stars: ✭ 26 (+30%)
Mutual labels:  xsd
SAF-T-AO
Official XSD from the Government of Angola for use in SAF-T AO
Stars: ✭ 42 (+110%)
Mutual labels:  xsd
djantic
Pydantic model support for Django
Stars: ✭ 256 (+1180%)
Mutual labels:  django-orm
django-sqlalchemy
Django ORM built on top of SQLalchemy core 2.0 for seamless integration of SQLAlchemy with Django 4.1+ PostgreSQL 14+ only for now. [pre POC now]
Stars: ✭ 101 (+405%)
Mutual labels:  django-orm
xgen
XSD (XML Schema Definition) parser and Go/C/Java/Rust/TypeScript code generator
Stars: ✭ 153 (+665%)
Mutual labels:  xsd
xslweb
Web application framework for XSLT and XQuery developers
Stars: ✭ 39 (+95%)
Mutual labels:  xsd
xsdata
Naive XML & JSON Bindings for python
Stars: ✭ 144 (+620%)
Mutual labels:  xsd
xsd-parser-rs
A xsd/wsdl => rust code generator written in rust
Stars: ✭ 45 (+125%)
Mutual labels:  xsd
openimmo
OpenImmo library
Stars: ✭ 36 (+80%)
Mutual labels:  xsd
LinqToXsdCore
LinqToXsd ported to .NET Core (targets .NET Standard 2 for generated code and .NET Core 3.1, .NET 5+ 6 for the code generator CLI tool).
Stars: ✭ 23 (+15%)
Mutual labels:  xsd
go-xsd-validate
Xsd validation for go based on libxml2
Stars: ✭ 42 (+110%)
Mutual labels:  xsd
reactant
Generate code for "models, views, and urls" based on Python type annotations. Supports Django REST, SQLAlchemy, Peewee.
Stars: ✭ 14 (-30%)
Mutual labels:  django-orm
xml-lint
A php tool to lint and validate xml files from the commandline.
Stars: ✭ 14 (-30%)
Mutual labels:  xsd
jgeXml
The Just-Good-Enough XML Toolkit
Stars: ✭ 20 (+0%)
Mutual labels:  xsd
phoenix.webui.framework
基于WebDriver的WebUI自动化测试框架
Stars: ✭ 118 (+490%)
Mutual labels:  xsd
djaq
Django queries
Stars: ✭ 54 (+170%)
Mutual labels:  django-orm

xsd_to_django_model

Generate Django models from an XSD schema description (and a bunch of hints)

TODO

  • More examples.
  • More heuristics.
  • Better xs:complexType/(xs:simpleContent|xs:complexContent)/xs:restriction support.
  • xs:simpleType/xs:union support.
  • ...?

Getting started

Usage:
    xsd_to_django_model.py [-m <models_filename>] [-f <fields_filename>] [-j <mapping_filename>] <xsd_filename> <xsd_type>...
    xsd_to_django_model.py -h | --help

Options:
    -h --help              Show this screen.
    -m <models_filename>   Output models filename [default: models.py].
    -f <fields_filename>   Output fields filename to build custom Django field classes.
    -j <mapping_filename>  Output JSON mapping filename [default: mapping.json].
    <xsd_filename>         Input XSD schema filename.
    <xsd_type>             XSD type (or, if starting with `/`, the name of the toplevel element of the type) for which a Django model should be generated.

If you have xsd_to_django_model_settings.py in your PYTHONPATH or in the current directory, it will be imported.

Examples

See the examples subdirectory.

Settings

If you have xsd_to_django_model_settings.py in your PYTHONPATH or in the current directory, it will be imported. It may define the following module-level variables:

  • MAX_LINE_LENGTH is maximum line length in generated Python code. Wrapping works for most of the cases; probably one should use black if that matters anyways.

  • TYPE_MOODEL_MAP is a collections.OrderedDict (you can use dict but then processing order is not guaranteed) which maps XSD xs:complexType names (including ones autogenerated for anonymous xs:complexTypes) to Django model class names, using regular expressions, e.g., if the XSD types are all called like tMyStrangeTasteType, this will generate model names like MyStrangeTaste:

    from collections import OrderedDict
    
    TYPE_MODEL_MAP = OrderedDict([
        (r't([A-Z].*)Type', r'\1'),
    ])

    If you are mapping different XSD types to a single Django model, prefix the Django model's name with + to make sure model merging logic works well.

  • MODEL_OPTIONS is a dict mapping model names to dicts of options applied when processing this model:

    MODEL_OPTIONS = {
        'MyStrangeTaste': {
            'abstract': True,
        },
    }

    Supported model options:

    • abstract - when True, enforce abstract = True in Django models Meta`.
    • add_fields - a list of extra fields which should be included in the final Django model class. Most of the options should be set in these definitions, overrides won't work. Example:
      'add_fields': [
          {
              'name': 'content_md5',                # Django model field name
              'dotted_name': 'a.any',               # path to the field in XML
              'django_field': 'models.UUIDField',   # Django field class
              'doc': 'A hash to speed up lookups',  # Django field's verbose_name
              'options': ['db_index=True'],         # Django field's options
          },
      ],
    • add_json_attrs - a mapping of extra JSON attributes to their documentation.
    • array_fields - a list of XSD fields for which django.contrip.postgres.fields.ArrayFields should be generated. The corresponding xs:element should either have maxOccurs="unbounded" or contain an xs:complexType whose only member has maxOccurs="unbounded".
    • coalesce_fields - a dict mapping generated field names to actual field names in Django models, using regular expressions, e.g.:
      'coalesce_fields': {
          r'a_very_long_autogenerated_prefix_(.+)': r'myprefix_\1',
      },
    • custom - when True, treat the model as a custom model which does not have a corresponding xs:complexType in XSD schema. Makes sense to use at least add_fields as well in such case.
    • drop_fields - a list of field names to be ignored when encountered, e.g.:
      'drop_fields': ['digitalSignature2KBInSize'],
    • field_docs - a dict which allows to override verbose_name Django model field option for given fields:
      'field_docs': {
          'objectName': 'Fully qualified object name',
      }
    • field_options - a dict mapping final Django model field names to a list of their overridden options, e.g.:
      'field_options': {
          'schemeVersion': ['max_length=7'],
      }
    • flatten_fields - a list of fields where the contained xs:complexType should not be treated as a separate Django model, but is to be merged in the current model, with member field names prefixed with this field's name and a _:
      'flatten_fields': ['section1', 'section2'],
    • flatten_prefixes - a list of field name prefixes which trigger the same flattening logic as flatten_fields. I do not recommend to use this option as things get too much automatic with it.
    • foreign_key_overrides - a dict mapping field names to XSD type names when this field is to be treated as a ForeignKey reference to that type`s corresponding model.
    • gin_index_fields - a list of Django model fields for which indexes are defined in Meta using Django 1.11+ indexes and django.contrib.postgres.indexes.GinIndex.
    • if_type - a dict mapping XSD type names to dicts of options which are used only when source XSD type name matches that type name; used by model merging logic to ensure merged fields do not differ in models being merged:
      'if_type': {
          'tMyStrangeTasteType': {
              'abstract': True,
          },
      },
    • ignore_merge_mismatch_fields: a list of fields for which generated code differences are to be ignored when model merging takes place. I do not recommend to use this option as it gets harder to track changes over time.
    • include_parent_fields: when True, the parent (xs:complexType/xs:complexContent/xs:extension[@base] type's fields are simply included in the current model instead of making Django model inheritance structures.
    • index_fields - a list of Django model fields for which db_index=True option should be generated.
    • json_fields - a list of XSD fields which do not get their own Django model fields but are all mapped to a single attrs = django.contrib.postgres.fields.JSONField().
    • many_to_many_field_overrides - a dict mapping field names to XSD type names when this field is to be treated as a ManyToManyField reference to that type`s corresponding model.
    • many_to_many_fields - a list of field names that get mapped to Django ManyToManyFields.
    • meta - a list of Django model Meta options' string templates added to the generated model's Meta:
      'meta': [
          'db_table = "my_%(model_lower)s"',
      ]
      Template variables:
      • model_lower resolves to lowercased model name.
    • methods - a list of strings that are included as methods in the generated model class, e.g.:
      'methods': [
          '    def __unicode__(self): return "%s: %s" % (self.code, self.amount)',
      ],
    • null_fields - a list of field names for which null=True Django model field option should be enforced.
    • one_to_many_field_overrides - a dict mapping one-to-many relationship field names to related Django model names when automated logic does not work well.
    • one_to_many_fields - a list of field names that get mapped to one-to-many relationships in Django, that is, a ForeignKey to this model is added to the related model's fields.
    • one_to_one_fields - a list of field names that get mapped to one-to-one (shared primary key) relationships in Django, that is, a OneToOneField(primary_key=True) to this model is added to the related models's fields.
    • override_field_class - a dict mapping field names to corresponding Django field class names when automated logic does not work well, e.g.:
      'override_field_class': {
          'formattedNumber': 'models.TextField',  # The actual data does not meet maximum length restriction
      }
    • parent_type - an XSD xs:complexType name which is to be used as this model's parent type when automated logic does not work, e.g., when custom is True.
    • plain_index_fields - a list of Django model fields for which indexes are defined in Meta using Django 1.11+ indexes and models.Index. This is useful when you don't need extra index for LIKE queries autogenerated with db_index=True option.
    • primary_key specifies a single field name for which primary_key=True Django model field option is to be generated.
    • reference_extension_fields - a list of field names which use xs:complexType/xs:complexContent/xs:extension' inheritance schema but extend the base type with extra members; these fields will be mapped to a ForeignKeyto their base type's model, and the extension members will be flattened (as inflatten_fields`).
    • reverse_fields - Sort fields in reflected lexicographic order to simplify merging fields from different flattened branches at mapping development time.
    • skip_code - if True, the generated model code is to be skipped when saving the models module.
    • strategy - if 1, the strategy is to flatten all nested structures by default unless they refer to a toplevel model, or to a N:many relationship.
    • strict_index_fields - a list of Django model fields to generate a composite index including the primary key.
    • unique_fields - a list of Django model fields for which unique=True option should be generated.
  • GLOBAL_MODEL_OPTIONS is a dict of model options applied to each model (but may be overridden by the respective options in that very model):

    GLOBAL_MODEL_OPTIONS = {
        'json_fields': ['attachments', 'abracatabra'],
    }

    Additional global options:

    • charfield_max_length_factor (defaults to 1) - a factor to multiply every CharFields max_length by, e.g. when actual XML data is bigger than XSD dictates.
  • TYPE_OVERRIDES is a dict mapping XSD type names to Django model fields when automatic heuristics don't work, e.g.:

    TYPE_OVERRIDES = {
        'xs:IDREF': ('A reference to xs:ID', 'CharField', {'max_length': 64}),
    }
  • BASETYPE_OVERRIDES is a dict mapping XSD base type names to Django field to override default ones, e.g.:

    BASETYPE_OVERRIDES = {
        'xs:hexBinary': 'CharField',
    }
  • IMPORTS is a string inserted after the automatically generated imports in the output models file, e.g.:

    IMPORTS = "from mycooldjangofields import StarTopologyField"
  • DOC_PREPROCESSOR is a function to preprocess documentation strings, e.g.:

    def doc_preprocessor(s):
        return s.replace('\n', ' ')
    
    DOC_PREPROCESSOR = doc_preprocessor
  • JSON_DOC_HEADING is documentation heading template for JsonFields.

  • JSON_GROUP_HEADING is documentation attribute group heading template for JsonFields.

  • JSON_DOC_INDENT is indent prefix in documentation sublists. The default is 4 spaces, which is compatible between Markdown and reStructuredText.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].