| 1 | | I didn't even realise that was possible! Cheers. |
| | 1 | I can't come up with an appropriate example, so I'll use a cut back version of actual code. I'm trying to implement an ISO standard, and am using a concrete base class, with a number of relations between objects, as shown below. Unfortunately, the names of these objects and relations are defined by the spec and can't be changed without a lot of hassle. |
| | 2 | |
| | 3 | {{{ |
| | 4 | |
| | 5 | class Metadata(models.Model): |
| | 6 | name = models.CharField(max_length=255) |
| | 7 | |
| | 8 | class Property(Metadata): |
| | 9 | pass |
| | 10 | |
| | 11 | class ObjectClass(Metadata): |
| | 12 | pass |
| | 13 | |
| | 14 | class DataElementConcept(Metadata): |
| | 15 | object_class = models.ForeignKey(ObjectClass) |
| | 16 | property= models.ForeignKey(Property) |
| | 17 | |
| | 18 | }}} |
| | 19 | |
| | 20 | However, the system checker has a problem with this: |
| | 21 | |
| | 22 | {{{ |
| | 23 | SystemCheckError: System check identified some issues: |
| | 24 | |
| | 25 | ERRORS: |
| | 26 | aristotle_mdr.DataElementConcept.property: (models.E006) The field 'property' clashes with the field 'property' from model 'aristotle_mdr._concept'. |
| | 27 | }}} |
| | 28 | |
| | 29 | What appears to happen is that DataElementConcept.property (a relation between two pieces of metadata) is clashing with MetadataItem.property (a relation from parent class to child class). |
| | 30 | |
| | 31 | Since a parent-child relationship using inheritance is just a OneToOneField thats made by [https://github.com/django/django/blob/5cc746206726c538c36a2830e7c068f1c8a0e7c8/django/db/models/base.py#L234 django.db.models.base.ModelBase] it'd be nice to be able to add some details to a classes Meta field to change the related_name of the generated field, for example: |
| | 32 | |
| | 33 | {{{ |
| | 34 | |
| | 35 | class Metadata(models.Model): |
| | 36 | name = models.CharField(max_length=255) |
| | 37 | |
| | 38 | class Property(Metadata): |
| | 39 | class Meta: |
| | 40 | parent_related_name = "property_subclass" |
| | 41 | |
| | 42 | }}} |
| | 43 | |
| | 44 | and the ModelBase coude would be similar to: |
| | 45 | |
| | 46 | {{{ |
| | 47 | field = OneToOneField( |
| | 48 | base, |
| | 49 | on_delete=CASCADE, |
| | 50 | name=attr_name, |
| | 51 | auto_created=True, |
| | 52 | parent_link=True, |
| | 53 | related_name=base._meta.parent_related_name |
| | 54 | ) |
| | 55 | }} |