Просто хотел добавить то, чего не видел в других ответах.
В отличие от классов python, скрытие имени поля не разрешено при наследовании модели.
Например, я экспериментировал со следующим вариантом использования:
У меня была модель, унаследованная от PermissionMixin django :
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
Тогда у меня был подмешать , который среди других вещей , которые я хотел, чтобы это переопределить related_name
в groups
поле. Так было примерно так:
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.'))
Я использовал эти 2 миксина следующим образом:
class Member(PermissionMixin, WithManagedGroupMixin):
pass
Так что да, я ожидал, что это сработает, но этого не произошло. Но проблема была более серьезной, потому что ошибка, которую я получал, вообще не указывала на модели, я понятия не имел, что пошло не так.
Пытаясь решить эту проблему, я случайно решил изменить свой миксин и преобразовать его в миксин абстрактной модели. Ошибка изменилась на это:
django.core.exceptions.FieldError: Local field 'groups' in class 'Member' clashes with field of similar name from base class 'PermissionMixin'
Как видите, эта ошибка объясняет, что происходит.
На мой взгляд, это была огромная разница :)