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