私のモデルの簡略化されたスキームがあります:
class A(Model):
name = CharField()
class B(Model):
a = models.ForeignKey(A, related_name='b', editable=False, null=False)
valid = models.NullBooleanField(default=None)
したがって、django は次のステートメントに対して 2 つの異なるクエリを生成します。
1) Qオブジェクトで除外
A.objects.filter().exclude(Q(b__valid=True))
SELECT a.name FROM a INNER JOIN b ON (a.id = b.a_id) WHERE NOT (b.valid = True)
2) フィールドルックアップで除外
A.objects.filter().exclude(b__valid=True)
SELECT a.name FROM a WHERE NOT
(a.id IN
(SELECT U1.a_id FROM b U1 WHERE
(U1.valid = True and U1.a_id IS NOT NULL)))
これは正常な動作ですか?さまざまなクエリを生成し、その結果、データベースからさまざまなアイテムを取得できます。たとえば、次のデータベース テーブルがあります。
A
id name
1 Seagull
2 Weasel
3 Deer
B
id a_id valid
1 1 1
1 1 0
最初のステートメントは 1-Seagull オブジェクトを返し、2 番目のステートメントは空のクエリセットを返します。正しい動作のようには見えません。