Volevo solo aggiungere qualcosa che non ho visto in altre risposte.
A differenza delle classi Python, nascondere il nome del campo non è consentito con l'ereditarietà del modello.
Ad esempio, ho sperimentato problemi con un caso d'uso come segue:
Avevo un modello che ereditava dall'autorizzazione di 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
Poi ho avuto il mio mixin che tra le altre cose volevo che avesse la precedenza related_name
su quello del groups
campo. Quindi era più o meno così:
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.'))
Stavo usando questi 2 mixin come segue:
class Member(PermissionMixin, WithManagedGroupMixin):
pass
Quindi sì, mi aspettavo che funzionasse ma non è stato così. Ma il problema era più serio perché l'errore che stavo ricevendo non puntava affatto ai modelli, non avevo idea di cosa stesse andando storto.
Durante il tentativo di risolvere questo problema, ho deciso a caso di cambiare il mio mixin e convertirlo in un modello astratto di mixin. L'errore è cambiato in questo:
django.core.exceptions.FieldError: Local field 'groups' in class 'Member' clashes with field of similar name from base class 'PermissionMixin'
Come puoi vedere, questo errore spiega cosa sta succedendo.
Questa è stata un'enorme differenza, secondo me :)