ValueError con la herencia de varias mesas en Django administración
-
27-09-2019 - |
Pregunta
He creado dos nuevas clases que heredan modelo de entrada:
class Entry(models.Model):
LANGUAGE_CHOICES = settings.LANGUAGES
language = models.CharField(max_length=2, verbose_name=_('Comment language'), choices=LANGUAGE_CHOICES)
user = models.ForeignKey(User)
country = models.ForeignKey(Country, null=True, blank=True)
created = models.DateTimeField(auto_now=True)
class Comment(Entry):
comment = models.CharField(max_length=2000, blank=True, verbose_name=_('Comment in English'))
class Discount(Entry):
discount = models.CharField(max_length=2000, blank=True, verbose_name=_('Comment in English'))
coupon = models.CharField(max_length=2000, blank=True, verbose_name=_('Coupon code if needed'))
Después de la adición de estos nuevos modelos de administración a través de admin.site.register Me estoy ValueError al intentar crear un comentario o un descuento vía de administración. Añadir entradas funciona bien.
Mensaje de error:
ValueError en / admin / comentarios / descuento / añadir /
No se puede asignar " ''": "Discount.discount" debe ser una instancia de "descuento".
Método de solicitud: GET
Solicitud de URL: http://127.0.0.1:8000/admin/reviews/discount/ añadir /
Tipo de excepción: ValueError
Excepción Valor:
No se puede asignar " ''": "Discount.discount" debe ser una instancia de "descuento".
Excepción Ubicación: /Library/Python/2.6/site-packages/django/db/models/fields/related.py en conjunto , la línea 211
Python ejecutable: / usr / bin / python
La versión de Python: 2.6.1
Solución
La razón de este error fue enviado precisamente porque yo mismo nombre de columna que ya se utilizó con el nombre del modelo. Karen T. contribuyó la siguiente respuesta en Django lista de correo :
El problema parece ser que usted tiene llamado un campo en el modelo de comentario con el mismo nombre, sólo se minúsculas. Comentar hereda de entrada, usando multi-mesa-herencia. Esto añade una OneToOneField en la parte posterior comentario de Entrada, que tiene un efecto secundario de añadiendo un atributo 'comentario' a la entrada. Este es el atributo que le permite acceder al comentario asociado a la Entrada como resultado de la OneToOneField en comentario, y por defecto se le dio el nombre de la modelo relacionado, en minúsculas.
La problema, entonces se produce cuando el comentario modelo "hereda toda la campos / atributos de entrada: la heredado 'comentario' atributo de La entrada es aparentemente primordiales del campo de comentario especificado. Eso es probablemente un error, pero parece han estado allí desde 1,0. yo no he hecho ninguna investigación para ver si ha sido informó.
Como una solución que pueda nombrar sus campos de algo que no sea el nombre del modelo todo en minúsculas, o puede especificar explícitamente el OneToOneField en los modelos de los niños, especificando parent_link = True y algo más que el nombre del modelo todo en minúsculas para related_name.
Otros consejos
Corazonada dice que podría hacer con declarar su clase de Entrada como uno abstracto a menos que necesite una entrada como un objeto real, también
...rest of Entry model here...
created = models.DateTimeField(auto_now_add=True) ## ONLY set date when created, not every save
class Meta:
abstract = True
...methods for your model etc...