urls tutorial template httpresponseredirect examples example django name-clash multi-table-inheritance django-1.9

tutorial - Django 1.9: el campo choca con el campo del campo no existente en el modelo padre



httpresponseredirect django (2)

Tengo algunos modelos simples, Profile, Certifier y Designer, los dos últimos heredados de Profile (herencia de tablas múltiples). En Designer hay una clave foránea para Certifier.

class Profile(models.Model): TYPES = ( (''admin'', _(''Administrator'')), (''certifier'', _(''Certifier'')), (''designer'', _(''Designer'')) ) user = models.OneToOneField(User) type = models.CharField(max_length=9, choices=TYPES) def __str__(self): return self.user.username + '' ('' + self.type + '')'' class Admin(Profile): pass class Certifier(Profile): pass class Designer(Profile): certifier = models.ForeignKey(Certifier)

En Django 1.8 esto funciona perfectamente, pero en 1.9 lo consigo;

django.core.management.base.SystemCheckError: SystemCheckError: La verificación del sistema identificó algunos problemas:

ERRORES:

check.Designer.certifier: (models.E006) El campo ''certificador'' choca con el campo ''certifier'' del modelo ''check.profile''.

(Profile.type es irrelevante en este caso, solo lo necesito para distinguir los tipos de perfil de usuario registrados).

check.profile obviamente no tiene un campo ''certificador''. ¿Es esto un error o me pierdo algo? Lo mismo sucede en otro proyecto.


Creo que no debería usar el certificador de nombres para esa relación de clave externa, ya que la clase Profile tiene campos de certifier , admin y designer (aunque por descriptor) de acuerdo con los docs y, en ese caso, los nombres en realidad podrían entrar en conflicto.

from django.contrib.auth.models import User c = Certifier.objects.create( type=''admin'', user=User.objects.latest(''date_joined''), ) p = c.profile_ptr print(p.certifier) #username (admin)

Cambiar a algo como certifier_field = models.ForeignKey(Certifier)

Como se señaló en los comentarios, puede cambiar el nombre de los modelos a CertifierProfile, AdminProfile, etc. para evitar el choque.

O también puede silenciar la comprobación agregando SILENCED_SYSTEM_CHECKS = [''models.E006''] a su settings , pero esto no es un buen enfoque.


Puede especificar Profile es una clase abstracta . Esto evitará que el cheque se confunda con los campos principales.

class Meta: abstract = True