1

有人可以解释这个简单但具有欺骗性的异常吗?

有两个模型,其中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却不高兴自己是空白的?


编辑:我确实注意到设置blank=True对上述行为没有影响,但这仍然不能解释这个问题。

现在这个:(?!?!?!)

>>> 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.
4

1 回答 1

2

好的,我设法解决了这个烂摊子。

这里的问题是模型和字段具有相同的名称(不区分大小写)。我在有问题的模型以及此处的示例(A.aB.b)中都有这个。

这是一个 Django 问题,因为该错误与真正的问题无关。

底线 - 没有任何与模型名称同名的字段。

于 2012-06-17T13:09:14.900 回答