web-dev-qa-db-ja.com

Django内部結合クエリセット

Djangoで作業しており、2つの内部結合を使用してクエリセットを実行する必要があります。

3つのモデルA、B、Cがあり、psqlで次のようなクエリを実行したいと思います。

select DISTINCT a from A inner join B on B.a_id = A.id inner join C on C.b_id = B.id;

モデル:(関連するフィールドのみが含まれています)

class A(models.Model):
    id = models.IntegerField(primary_key=True)

class B(models.Model):
    id = models.IntegerField(primary_key=True)
    a = models.ForeignKey(A, null=True, blank=True,on_delete=models.SET_NULL)

class C(models.Model):
    b = models.ForeignKey(B, null=True, on_delete=models.SET_NULL)   

したがって、CのすべてがBの1つのものにリンクし、BのすべてがAの1つのものにリンクします。Cに何かがあるAのすべての個別の要素を取得しようとします。

Django querysetを使用してこれを行うにはどうすればよいですか?ありがとうございます。

14
user1998511

A.objects.filter(b__c__isnull=False)は、同じ結果のSQLを生成します。

SELECT DISTINCT a.* FROM a INNER JOIN b ON (a.id = b.a_id) INNER JOIN c ON (b.id=c.b_id)
WHERE c.id IS NOT NULL;

P.S. IDにIntegerFieldの代わりにAutoFieldを使用するのはなぜですか?

26
okm