1

誰かがこの単純な、しかし欺瞞的な異常を説明できますか?

2 つのモデルがあります。ここで、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

OK、私はこの混乱を解決することができました。

ここでの問題は、モデルとフィールドが同じ名前 (大文字と小文字を区別しない) であることです。A.a問題のあるモデルと、ここの例 (および)の両方にこれがありましたB.b

これは、エラーが実際の問題とは単に無関係であるという点で、Django の問題です。

結論 - モデル名と同じ名前のフィールドを持たないでください。

于 2012-06-17T13:09:14.900 に答える