बस कुछ ऐसा जोड़ना चाहते थे जो मैंने अन्य उत्तरों में नहीं देखा है।
अजगर वर्गों के साथ, क्षेत्र का नाम छिपाना मॉडल विरासत के साथ अनुमति नहीं है ।
उदाहरण के लिए, मैंने एक प्रयोग के मामले के साथ मुद्दों का प्रयोग किया है:
मैं एक मॉडल Django के प्रमाणन से इनहेरिट था 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 मिश्रण का उपयोग कर रहा था:
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'
जैसा कि आप देख सकते हैं, यह त्रुटि बताती है कि क्या चल रहा है।
यह एक बहुत बड़ा अंतर था, मेरी राय में :)