Django子模型中的空值
有人能解释这一简单但具有欺骗性的异常现象吗 有两种模型,其中Django子模型中的空值,django,django-models,Django,Django Models,有人能解释这一简单但具有欺骗性的异常现象吗 有两种模型,其中B是a的子模型: # models.py class A(models.Model): a = models.IntegerField(blank=True) class B(A): b = models.IntegerField(blank=True) 很简单,对吧?但在运行时: >>> A() <A: A object> >>> B() Traceback (mos
B
是a
的子模型:
# models.py
class A(models.Model):
a = models.IntegerField(blank=True)
class B(A):
b = models.IntegerField(blank=True)
很简单,对吧?但在运行时:
>>> A()
<A: A object>
>>> B()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "django/db/models/base.py", line 357, in __init__
setattr(self, field.attname, val)
File "django/db/models/fields/related.py", line 271, in __set__
(instance._meta.object_name, self.related.get_accessor_name()))
ValueError: Cannot assign None: "B.b" does not allow null values.
好吧,我设法解决了这个问题 这里的问题是模型和字段具有相同的名称(不区分大小写)。我在有问题的模型中以及这里的示例中都有这一点(
A.A
和B.B
)
这是一个Django问题,因为错误与实际问题完全无关
底线-没有任何字段与模型名同名。我越是考虑这个问题,就越觉得这是一个错误。跟随发展我倾向于同意。我刚刚运行了相同的测试,并且出现了相同的错误(django 1.2)。即使将一个文件设置为抽象文件也不能解决这个问题。除非您试图保存实例,否则验证不应该失败-但这里失败的是关系描述符..哦,设置null=True将解决此特定错误,但是您应该能够构造没有值的对象,并在以后保存它们。您使用的是什么版本的django?哦!这根本不是场上的事。。这都是关于冲突的字段名!我现在就不写我的答案了:只需接受你自己的答案,但我会在评论中提供更多信息。要添加更多信息,要从
a
访问B
,a
会获得一个属性B
,该属性引用B
的反向关系实例。由于继承,此“阴影”直接在b
上定义的b
属性。django继承模型中禁止字段阴影。。虽然我现在找不到提到这一点的文档。
>>> a = A(a=5)
>>> b = B(b=6)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "django/db/models/base.py", line 357, in __init__
setattr(self, field.attname, val)
File "django/db/models/fields/related.py", line 275, in __set__
self.related.get_accessor_name(), self.related.opts.object_name))
ValueError: Cannot assign "6": "B.b" must be a "B" instance.