Ich wollte nur etwas hinzufügen, was ich in anderen Antworten nicht gesehen habe.
Anders als bei Python-Klassen ist das Ausblenden von Feldnamen bei der Modellvererbung nicht zulässig .
Zum Beispiel habe ich Probleme mit einem Anwendungsfall wie folgt experimentiert:
Ich hatte ein Modell, das von Djangos auth PermissionMixin geerbt wurde :
class PermissionsMixin(models.Model):
"""
A mixin class that adds the fields and methods necessary to support
Django's Group and Permission model using the ModelBackend.
"""
is_superuser = models.BooleanField(_('superuser status'), default=False,
help_text=_('Designates that this user has all permissions without '
'explicitly assigning them.'))
groups = models.ManyToManyField(Group, verbose_name=_('groups'),
blank=True, help_text=_('The groups this user belongs to. A user will '
'get all permissions granted to each of '
'his/her group.'))
user_permissions = models.ManyToManyField(Permission,
verbose_name=_('user permissions'), blank=True,
help_text='Specific permissions for this user.')
class Meta:
abstract = True
Dann hatte ich mein Mixin, das unter anderem related_name
das groups
Feld außer Kraft setzen sollte . So war es mehr oder weniger so:
class WithManagedGroupMixin(object):
groups = models.ManyToManyField(Group, verbose_name=_('groups'),
related_name="%(app_label)s_%(class)s",
blank=True, help_text=_('The groups this user belongs to. A user will '
'get all permissions granted to each of '
'his/her group.'))
Ich habe diese 2 Mixins wie folgt verwendet:
class Member(PermissionMixin, WithManagedGroupMixin):
pass
Also ja, ich habe erwartet, dass das funktioniert, aber es hat nicht funktioniert. Das Problem war jedoch schwerwiegender, da der Fehler, den ich erhielt, überhaupt nicht auf die Modelle hinwies und ich keine Ahnung hatte, was schief lief.
Während ich versuchte, dies zu lösen, entschied ich mich zufällig, mein Mixin zu ändern und es in ein abstraktes Modell-Mixin umzuwandeln. Der Fehler hat sich folgendermaßen geändert:
django.core.exceptions.FieldError: Local field 'groups' in class 'Member' clashes with field of similar name from base class 'PermissionMixin'
Wie Sie sehen können, erklärt dieser Fehler, was los ist.
Das war meiner Meinung nach ein großer Unterschied :)