只是想添加一些我在其他答案中没有看到的东西。
与 python 类不同,模型继承不允许字段名称隐藏。
例如,我用一个用例试验了如下问题:
我有一个继承自 django 的 auth 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
# ...
然后我有了我的 mixin,其中我希望它覆盖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个mixin,如下所示:
class Member(PermissionMixin, WithManagedGroupMixin):
pass
所以,是的,我希望这会起作用,但事实并非如此。但问题更严重,因为我得到的错误根本没有指向模型,我不知道出了什么问题。
在尝试解决这个问题时,我随机决定更改我的 mixin 并将其转换为抽象模型 mixin。错误变成了这样:
django.core.exceptions.FieldError: Local field 'groups' in class 'Member' clashes with field of similar name from base class 'PermissionMixin'
如您所见,此错误确实解释了发生了什么。
在我看来,这是一个巨大的差异:)