て設定します:注釈Djangoのクエリは次のようにモデルの簡単なセットを考えると逆の外部キー
class A(models.Model):
pass
class B(models.Model):
parent = models.ForeignKey(A, related_name='b_set')
class C(models.Model):
parent = models.ForeignKey(B, related_name='c_set')
私は2つの注釈とともにA
モデルのクエリセットを作成するために探しています。 1つの注釈は、A
行を親として持つB
行の番号である必要があります。もう1つの注釈はB
行の番号を、A
オブジェクトを親とし、少なくともn
タイプのC
オブジェクトをc_set
に持つことを示す必要があります。例として
、以下のデータベースとn = 3
検討:ID 0のA
オブジェクトが二B
オブジェクトを有するので、私は、フォーム[(0, 2, 1), (1, 0, 0)]
の結果を得ることができるたい
Table A
id
0
1
Table B
id parent
0 0
1 0
Table C
id parent
0 0
1 0
2 1
3 1
4 1
を1つは少なくとも3つの関連するオブジェクトを有する。 id 1のA
オブジェクトにはB
オブジェクトがないため、少なくとも3つのC
行のオブジェクトも含まれていません(B
オブジェクト)。
最初の注釈は簡単です:
A.objects.annotate(annotation_1=Count('b_set'))
私は今、設計しようとしています何秒の注釈です。私は次のようにB
オブジェクトは、少なくとも一つのC
を目的としているA
あたりB
の行数カウントするように管理しています
A.objects.annotate(annotation_2=Count('b_set__c_set__parent', distinct=True))
をしかし、私は他の最小関連セット・サイズでそれを行う方法を把握することはできません1つ以上。うまくいけば、ここの誰かが正しい方向に私を向けることができます。私が考えていた1つの方法は、A
行の代わりにB
オブジェクトをクエリに何らかの形で注釈を付けることでしたが、これはアノテートメソッドのデフォルトですが、これでリソースを見つけることができませんでした。