Django Admin中具有多表继承的ValueError

jor*_*llo 5 django django-admin multi-table

我创建了两个继承模型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'))
Run Code Online (Sandbox Code Playgroud)

通过admin.site.register将这些新模型添加到管理员后,我在尝试通过管理员创建评论或折扣时收到ValueError.添加条目工作正常.

错误消息:

/ admin/reviews/discount/add /中的ValueError不能指定"''":"Discount.discount"必须是"Discount"实例.请求方法:GET请求URL:http://127.0.0.1 :8000/admin/sort/amount/ add / Exception Type: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

jor*_*llo 6

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

问题似乎是您在Comment模型中使用相同的名称命名了一个字段,只是小写.注释继承自Entry,使用多表继承.这会在注释中将OneToOneField添加回Entry,这会产生向Entry添加"comment"属性的副作用.这是一个属性,允许您通过Comment中的OneToOneField访问与Entry关联的Comment,默认情况下,它会给出相关模型的名称,全小写.

当Comment模型"继承"Entry的所有字段/属性时,会出现问题:Entry中继承的'comment'属性显然超出了指定的注释字段.这可能是一个错误,但它似乎一直存在1.0.我没有做过任何研究,看看是否有报道.

作为一种变通方法,您可以将字段命名为模型名称以外的所有字段,或者您可以在子模型中显式指定OneToOneField,指定parent_link = True以及除相关名称之外的所有小写的模型名称.