Diğer cevaplarda görmediğim bir şeyi eklemek istedim.
Python sınıflarından farklı olarak, model kalıtımıyla alan adı gizlemeye izin verilmez .
Örneğin, bir kullanım senaryosu ile ilgili sorunları aşağıdaki gibi denedim:
Django'nun PermissionMixin yetkisinden miras alan bir modelim vardı :
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
Sonra diğer şeylerin yanı sıra bunun geçersiz kılmak istedim benim mixin vardı related_name
ait groups
alanda. Yani aşağı yukarı şöyle:
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.'))
Bu 2 mixini şu şekilde kullanıyordum:
class Member(PermissionMixin, WithManagedGroupMixin):
pass
Yani evet, bunun işe yaramasını bekliyordum ama olmadı. Ancak sorun daha ciddiydi çünkü aldığım hata modellere hiç işaret etmiyordu, neyin yanlış gittiğine dair hiçbir fikrim yoktu.
Bunu çözmeye çalışırken rastgele mixinimi değiştirmeye ve onu soyut bir model karışımına dönüştürmeye karar verdim. Hata şu şekilde değişti:
django.core.exceptions.FieldError: Local field 'groups' in class 'Member' clashes with field of similar name from base class 'PermissionMixin'
Gördüğünüz gibi, bu hata neler olup bittiğini açıklıyor.
Bu bence çok büyük bir farktı :)