Solo quería agregar algo que no he visto en otras respuestas.
A diferencia de las clases de Python, la ocultación del nombre de campo no está permitida con la herencia del modelo.
Por ejemplo, he experimentado problemas con un caso de uso de la siguiente manera:
Tenía un modelo que heredaba de la autenticación PermissionMixin de 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
Luego tuve mi mezcla que, entre otras cosas, quería que anulara la related_name
del groups
campo. Entonces fue más o menos así:
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.'))
Estaba usando estos 2 mixins de la siguiente manera:
class Member(PermissionMixin, WithManagedGroupMixin):
pass
Así que sí, esperaba que esto funcionara, pero no fue así. Pero el problema era más serio porque el error que estaba obteniendo no apuntaba a los modelos en absoluto, no tenía idea de lo que estaba saliendo mal.
Mientras trataba de resolver esto, decidí al azar cambiar mi mezcla y convertirla en una mezcla de modelo abstracto. El error cambió a esto:
django.core.exceptions.FieldError: Local field 'groups' in class 'Member' clashes with field of similar name from base class 'PermissionMixin'
Como puede ver, este error explica lo que está sucediendo.
Esta fue una gran diferencia, en mi opinión :)