Chciałem tylko dodać coś, czego nie widziałem w innych odpowiedziach.
W przeciwieństwie do klas Pythona, ukrywanie nazw pól nie jest dozwolone w przypadku dziedziczenia modelu.
Na przykład eksperymentowałem z problemami z przypadkiem użycia w następujący sposób:
Miałem model dziedziczący po auth django PermissionMixin :
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
Potem miałem wstawek, które między innymi chciałem, aby przesłonić related_name
na groups
polu. Więc było mniej więcej tak:
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.'))
Używałem tych 2 mixinów w następujący sposób:
class Member(PermissionMixin, WithManagedGroupMixin):
pass
Więc tak, spodziewałem się, że to zadziała, ale tak się nie stało. Ale problem był poważniejszy, ponieważ błąd, który otrzymywałem, w ogóle nie wskazywał na modele, nie miałem pojęcia, co się dzieje.
Próbując rozwiązać ten problem, losowo zdecydowałem się zmienić mój miks i przekonwertować go na abstrakcyjny miks modelu. Błąd zmienił się na ten:
django.core.exceptions.FieldError: Local field 'groups' in class 'Member' clashes with field of similar name from base class 'PermissionMixin'
Jak widać, ten błąd wyjaśnia, co się dzieje.
To była moim zdaniem ogromna różnica :)