1

私のモデルの簡略化されたスキームがあります:

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 番目のステートメントは空のクエリセットを返します。正しい動作のようには見えません。

4

0 に答える 0