Django Admin 中多表继承的 ValueError
-
27-09-2019 - |
题
我创建了两个继承模型 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 。添加条目效果很好。
错误消息:
AT/ADMIN/REVICE/discount/add/无法分配“''”:“Discount.discount”必须是“Discount”实例。请求方式:获取请求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/lated.py 中 放, ,第211行Python可执行文件:/usr/bin/python python版本:2.6.1
解决方案
出现此错误的原因是因为我使用了与模型名称已使用的相同的列名称。凯伦·T。贡献了以下答案 Django 邮件列表:
问题似乎是您在评论模型中命名了一个字段,其名称相同,只有较低的情况。使用多尾传播的评论继承。这添加了一个OneToOneField回到条目中,该输入具有将“注释”属性添加到条目中的副作用。这是一个属性,可让您访问IneToOneField在评论中的条目关联的注释,默认情况下,它被授予相关模型的名称。
当评论模型“继承所有字段/条目属性:输入的继承的“注释”属性显然是超越指定的注释字段。这可能是一个错误,但是自1.0以来似乎就一直在那里。我没有进行任何研究以查看是否有报道。
作为解决方法,您可以将字段命名除了模型名称以外的所有内容,也可以明确指定子模型中的OneToOneField,指定parents_link = true,除了模型名称以外的其他所有内容都以相关的_name为单位。
其他提示
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...