2017-07-13 5 views
3

de clé étrangère étrangère J'ai trois modèles principaux:nombre Django annoter de la clé

Class Client(models.Model): 
    stuff 

Class Property(models.Model): 
    client = models.ForeignKey(Client) 
    branch = models.ForeignKey(Branch, blank=True, null=True) 

Class Branch(models.Model): 
    name = models.CharField(max_length=200) 

Mon but final est essentiellement d'essayer et d'en déduire la branche la plus impliquée d'un client en fonction des propriétés qu'il est connecté.

Je suis sûr que la meilleure façon d'y parvenir est d'utiliser l'agrégat de Django en utilisant annotate, mais je ne suis pas sûr de savoir exactement comment faire cela. Je devrais utiliser extra à la place.

Je sais que je vais avoir besoin de quelque chose comme Client.objects.annotate(branch_count=Count('property__branch')), mais j'ai besoin d'ajouter un filtrage pour les propriétés attachées à chaque branche.

L'autre façon est peut-être d'utiliser Collections.Counter

d = {} 
for c in Client.objects.all(): 
    d[c] = Counter(c.property_set.values_list('branch', flat=True)) 

Ce construirait un dictionnaire de compte, alors je vais l'utiliser pour rechercher la branche avec le nombre le plus élevé pour un client.

Répondre

0

Dans le modèle de la propriété donnent un attribut related_name au client (permet de dire « client_ref »)

Client.objects.annotate(branch_count=Count( 'client_ref__branch')).filter(branch__name="some_name") .values('branch')

où le nom peut être remplacé par une autre propriété de filtre

+0

-t-il résoudre le problème? –