Étant donné un simple ensemble de modèles comme suit:requête Django Annoter définit par des clés étrangères inverse
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')
Je cherche à créer une requête ensemble de modèle A
avec deux annotations. Une annotation doit correspondre au nombre de lignes B
dont la ligne A
est en question en tant que parent. L'autre annotation doit indiquer le nombre de B
lignes, à nouveau avec l'objet A
en question en tant que parent, qui ont au moins n
objets de type C
dans leur c_set
.
À titre d'exemple, considérons la base de données suivante et n = 3
:
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
je voudrais être en mesure d'obtenir un résultat de la forme [(0, 2, 1), (1, 0, 0)]
comme l'objet A
avec id 0 a deux objets dont B
on a au moins trois objets connexes C
. L'objet A
avec l'ID 1 n'a aucun objet B
et par conséquent, aucun objet B
avec au moins trois lignes C
.
La première annotation est trivial:
A.objects.annotate(annotation_1=Count('b_set'))
Ce que je suis en train de concevoir est maintenant la deuxième annotation. J'ai réussi à compter le nombre de B
lignes par A
où l'objet B
a au moins un objet unique C
comme suit:
A.objects.annotate(annotation_2=Count('b_set__c_set__parent', distinct=True))
Mais je ne peux pas trouver un moyen de le faire avec une taille de jeu lié au minimum d'autres d'un. J'espère que quelqu'un ici pourra me diriger dans la bonne direction. Une méthode à laquelle je pensais consistait en quelque sorte à annoter les objets B
dans la requête au lieu des lignes A
comme c'est le cas par défaut de la méthode annotate mais je n'ai trouvé aucune ressource sur ceci.