Tôi chỉ muốn thêm một cái gì đó mà tôi chưa thấy trong các câu trả lời khác.
Không giống như với các lớp python, ẩn tên trường không được phép với kế thừa mô hình.
Ví dụ: tôi đã thử nghiệm các vấn đề với một ca sử dụng như sau:
Tôi đã có một mô hình kế thừa từ PermissionMixin auth của 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
Sau đó, tôi có mixin của tôi mà trong số những thứ khác tôi muốn nó ghi đè lên related_name
các groups
lĩnh vực. Vì vậy, nó ít nhiều giống như thế này:
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.'))
Tôi đã sử dụng 2 mixin này như sau:
class Member(PermissionMixin, WithManagedGroupMixin):
pass
Vì vậy, tôi mong đợi điều này sẽ hoạt động nhưng nó đã không. Nhưng vấn đề nghiêm trọng hơn vì lỗi mà tôi nhận được không chỉ vào các mô hình, tôi không biết điều gì đang xảy ra.
Trong khi cố gắng giải quyết vấn đề này, tôi ngẫu nhiên quyết định thay đổi mixin của mình và chuyển nó thành mixin mô hình trừu tượng. Lỗi đã thay đổi thành thế này:
django.core.exceptions.FieldError: Local field 'groups' in class 'Member' clashes with field of similar name from base class 'PermissionMixin'
Như bạn có thể thấy, lỗi này giải thích những gì đang xảy ra.
Đây là một sự khác biệt rất lớn, theo ý kiến của tôi :)