【问题标题】:ValueError with multi-table inheritance in Django AdminDjango Admin中具有多表继承的ValueError
【发布时间】:2011-02-19 21:18:51
【问题描述】:

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

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 在 /admin/reviews/discount/add/ 无法分配“''”:“Discount.discount”必须是“Discount”实例。 请求方法:GET 请求网址: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,第 211 行 Python 可执行文件:/usr/bin/python Python 版本:2.6.1

【问题讨论】:

  • 您可以粘贴/dpaste 尝试保存模型和完整回溯的视图代码吗?
  • Traceback: dpaste.com/195193 我在 Django 管理员中“添加折扣”时遇到了这个问题。尝试通过 shell 创建新折扣时出现相同的错误 (discount = Discount())

标签: django django-admin multi-table


【解决方案1】:

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

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

然后在评论时出现问题 模型“继承”所有 条目的字段/属性: 从继承的“评论”属性 条目显然是压倒一切的 指定的评论字段。那是 可能是一个错误,但它似乎 自 1.0 以来一直存在。我还没有 做了任何研究,看看它是否已经 报道。

作为一种解决方法,您可以 将您的字段命名为 型号名称全部小写,或者您 可以明确指定 子模型中的 OneToOneField, 指定 parent_link=True 和 型号名称以外的东西 related_name 全部小写。

【讨论】:

    【解决方案2】:

    预感说你可以将 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...
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多