Просто хотів додати те, чого я не бачив в інших відповідях.
На відміну від класів python, приховування імен полів не дозволено успадкуванням моделі.
Наприклад, я експериментував із випадками використання наступним чином:
У мене була модель, яка успадковується від auth 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'
Як бачите, ця помилка справді пояснює, що відбувається.
На мою думку, це була величезна різниця :)