ValueError avec l'héritage multi-table dans Django admin
-
27-09-2019 - |
Question
Je créé deux nouvelles classes modèle Hériter Entrée:
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'))
Après l'ajout de ces nouveaux modèles à admin via admin.site.register Je reçois ValueError en essayant de créer un commentaire ou une réduction par admin. Ajout d'entrées fonctionne très bien.
msg d'erreur:
ValueError à / admin / critiques / réduction / ajouter /
Ne peut pas affecter « « » »: « Discount.discount » doit être une instance « Discount ».
Demande Méthode: GET
URL de demande: http://127.0.0.1:8000/admin/reviews/discount/ ajouter /
Type d'exception: ValueError
Exception Valeur:
Ne peut pas affecter « « » »: « Discount.discount » doit être une instance « Discount ».
Exception Localisation: /Library/Python/2.6/site-packages/django/db/models/fields/related.py ensemble , ligne 211
Python Executable: / usr / bin / python
Python Version: 2.6.1
La solution
La raison de cette erreur est apparue parce que j'utilisé le nom même de la colonne qui a déjà été utilisé avec le nom du modèle. Karen T. a contribué à la réponse suivante Django liste de diffusion :
Le problème semble être que vous avez nommé un champ dans votre modèle Commentaire avec le même nom, baissez seul cas. Commentaire de l'entrée hérite, en utilisant multi-table héritage. Cela ajoute une OneToOneField dans le dos de commentaire à Entrée, qui a un effet secondaire de l'ajout d'un attribut « commentaire » à l'entrée. Ceci est l'attribut qui vous permet de accéder au commentaire associé à la Entrée à la suite de la OneToOneField dans Commentaire, et par défaut, il est donné le nom de la modèle connexe, tout en minuscules.
problème se produit alors lorsque le commentaire modèle « hérite tous les champs / attributs d'entrée: la attribut hérité « commentaire » de L'entrée est apparemment trop surfe sur la champ de commentaire spécifié. C'est probablement un bug, mais il semble ont été là depuis la version 1.0. je n'ai pas fait des recherches pour voir si elle a été signalé.
Pour contourner ce problème, vous pouvez nommer vos champs autre chose que le nom du modèle tout en minuscules, ou vous peut spécifier explicitement le OneToOneField dans les modèles enfants, spécifiant parent_link = True et autre chose que le nom du modèle tous pour related_name en minuscules.
Autres conseils
Hunch dit que vous pourriez faire avec la déclaration de votre classe d'entrée comme abstraite, sauf si vous avez besoin d'une entrée comme un objet réel, trop
...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...