2010-05-15 15 views
4

I a créé deux nouvelles classes qui héritent le modèle d'entrée:ValueError avec l'héritage multi-table dans Django Administrateur

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 via admin. L'ajout d'entrées fonctionne 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/add/ Exception Type: 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 à mis, ligne 211 Python Executable:/usr/bin/python Python Version: 2.6.1

+0

Pouvez-vous coller/dpasser votre code d'affichage qui essaie de sauvegarder le modèle et le retraçage complet? –

+0

Traceback: http://dpaste.com/195193/ Je reçois ceci en allant à "Ajouter un rabais" dans l'admin Django. La même erreur apparaît lorsque vous essayez de créer une nouvelle réduction via shell (discount = Discount()) – jorilallo

Répondre

5

La raison de cette erreur est apparue parce que j'utilisé même nom de colonne était déjà utilisé avec le nom du modèle. Karen T. a contribué à la réponse suivante Django mailing list:

Le problème semble être que vous avez nommé un champ dans votre modèle Commentaire avec le même nom, seulement des minuscules. Le commentaire hérite de l'entrée en utilisant l'héritage multi-table . Cela ajoute un OneToOneField dans Commentaire à Entrée, qui a un effet secondaire de en ajoutant un attribut 'comment' à Entrée. Ce est l'attribut qui vous permet de accéder au commentaire associé à l'entrée à la suite de la OneToOneField dans Commentaire, et par défaut, il est donné le nom du modèle lié , tout en minuscule.

Le problème se produit alors lorsque le commentaire modèle « de tous les champs/attributs d'entrée: la héritée « hérite attribut » Commentaire de L'entrée est apparemment trop à cheval le 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é rapporté.

pour contourner ce problème, vous pouvez vos champs nom autre chose que le nom du modèle tout en minuscules, ou vous pouvez spécifier explicitement la 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.

0

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... 
+0

J'ai décidé d'aller avec l'héritage multi-table, car j'ai besoin d'interroger sac mélangé d'objets dans une liste. Basé sur la documentation cela devrait fonctionner: http://docs.djangoproject.com/fr/1.1/topics/db/models/#id7 – jorilallo