แค่อยากจะเพิ่มบางสิ่งที่ฉันไม่เห็นในคำตอบอื่น ๆ
ไม่เหมือนกับคลาส python การซ่อนชื่อฟิลด์ไม่ได้รับอนุญาตกับการสืบทอดโมเดล
ตัวอย่างเช่นฉันได้ทดลองปัญหาเกี่ยวกับกรณีการใช้งานดังนี้:
ฉันมีโมเดลที่สืบทอดมาจาก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
จากนั้นผมก็มี 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 มิกซ์อินนี้ดังนี้:
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'
อย่างที่คุณเห็นข้อผิดพลาดนี้อธิบายถึงสิ่งที่เกิดขึ้น
นี่เป็นความแตกต่างอย่างมากในความคิดของฉัน :)