5

我创建了两个继承模型条目的新类:

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。添加条目工作正常。

错误信息:

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

4

2 回答 2

6

出现此错误的原因是因为我使用了已与模型名称一起使用的相同列名称。Karen T. 在Django 邮件列表中提供了以下答案:

问题似乎是您在 Comment 模型中使用相同的名称命名了一个字段,只是小写。Comment 继承自 Entry,使用多表继承。这会将 Comment 中的 OneToOneField 添加回 Entry,这具有向 Entry 添加“comment”属性的副作用。这是一个属性,允许您访问与条目关联的评论,作为评论中的 OneToOneField 的结果,默认情况下,它被赋予相关模型的名称,全小写。

当评论模型“继承”条目的所有字段/属性时,就会出现问题:从条目继承的“评论”属性显然覆盖了指定的评论字段。这可能是一个错误,但它似乎一直存在1.0. 我没有做任何研究看看它是否被报道过。

作为一种解决方法,您可以将模型名称以外的字段命名为全部小写,或者您可以在子模型中显式指定 OneToOneField,指定 parent_link=True 和模型名称以外的其他名称,相关名称全部小写。

于 2010-05-16T16:12:51.630 回答
0

Hunch 说你可以将 Entry 类声明为抽象类,除非你也需要一个 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...
于 2010-05-15T14:18:34.750 回答