Django Admin中多表继承出现ValueError错误

5

我创建了两个继承自模型Entry的新类:

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'))

通过在admin.site.register中添加这些新模型后,我在尝试通过管理员创建评论或折扣时遇到了ValueError。添加条目没有问题。

错误消息:

ValueError at /admin/reviews/discount/add/ 无法分配“''”:“Discount.discount”必须是“Discount”实例。 请求方法:GET 请求URL:http://127.0.0.1:8000/admin/reviews/discount/add/ 异常类型:ValueError 异常值:
无法分配“''”:“Discount.discount”必须是“Discount”实例。 异常位置:/Library/Python/2.6/site-packages/django/db/models/fields/related.py in set, line 211 Python可执行文件:/usr/bin/python Python版本:2.6.1


你能否粘贴/ dpaste 你的视图代码,尝试保存模型和完整的回溯信息? - Steve Jalim
追踪:http://dpaste.com/195193/ 当我进入Django管理页面中的“添加折扣”时,会出现这个错误。在shell中尝试创建新的折扣(discount = Discount())时也会出现相同的错误。 - jorilallo
2个回答

6
出现此错误的原因是我使用了与模型名称已经使用过的相同列名。Karen T.在Django邮件列表中提供了以下答案:
问题似乎是您在Comment模型中使用了相同的名称,只是小写。 Comment使用多表继承从Entry继承,这会在Comment中添加一个OneToOneField返回到Entry,这会导致为Entry添加一个'comment'属性。这是让您访问与Entry相关联的Comment的属性,因为Comment中的OneToOneField,默认情况下它被赋予相关模型的名称,全部小写。然后问题出现在Comment模型“继承”Entry的所有字段/属性时:从Entry继承的'comment'属性显然覆盖了指定的comment字段。这可能是一个错误,但自1.0版本以来似乎一直存在。作为解决方法,您可以将字段命名为除了模型名称之外的其他名称,或者在子模型中明确指定OneToOneField,指定parent_link=True和与模型名称不同的related_name。

0
直觉告诉我,除非你需要一个实际的对象,否则你可以将Entry类声明为抽象类。
...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...

我决定使用多表继承,因为我需要在一个列表中查询混合的对象。根据文档,这应该可以实现:http://docs.djangoproject.com/en/1.1/topics/db/models/#id7 - jorilallo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接