Hanya ingin menambahkan sesuatu yang belum pernah saya lihat di jawaban lain.
Berbeda dengan kelas python, penyembunyian nama bidang tidak diizinkan dengan pewarisan model.
Misalnya, saya telah bereksperimen dengan kasus penggunaan sebagai berikut:
Saya memiliki model yang diwarisi dari PermissionMixin auth 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
Kemudian aku mixin saya yang antara lain Aku ingin menimpa related_name
dari groups
lapangan. Jadi kurang lebih seperti ini:
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.'))
Saya menggunakan 2 mixin ini sebagai berikut:
class Member(PermissionMixin, WithManagedGroupMixin):
pass
Jadi ya, saya berharap ini berhasil tetapi ternyata tidak. Tetapi masalahnya lebih serius karena kesalahan yang saya dapatkan sama sekali tidak mengarah ke model, saya tidak tahu apa yang salah.
Ketika mencoba menyelesaikan ini, saya secara acak memutuskan untuk mengubah mixin saya dan mengubahnya menjadi mixin model abstrak. Kesalahan berubah menjadi ini:
django.core.exceptions.FieldError: Local field 'groups' in class 'Member' clashes with field of similar name from base class 'PermissionMixin'
Seperti yang Anda lihat, kesalahan ini menjelaskan apa yang sedang terjadi.
Ini adalah perbedaan yang sangat besar, menurut saya :)