2010-08-31 4 views
2

J'ai un modèle Person et un modèle Tag, avec un m2m entre eux.Django: comment agréger/annoter sur une relation plusieurs-à-plusieurs?

Je dois extraire l'étiquette qui est connectée au plus grand nombre d'enregistrements dans un ensemble de requêtes donné, avec le nombre.

Existe-t-il un moyen élégant et efficace d'extraire ceci en utilisant l'ORM de Django?

Mieux encore, existe-t-il un moyen d'obtenir la distribution entière de l'étiquette grâce à une annotation? Comment peut-on même tirer tous les objets connectés à un sous-ensemble d'objets connectés via un m2m?

Merci!

Répondre

4

Cela vous donne l'étiquette la plus fréquente:

from django.db.models import Count 
Tag.objects.filter(person__yourcriterahere=whatever [, morecriteria]).annotate(cnt=Count('person')).order_by('-cnt')[0] 
+0

utile grand !!!!!!!! – pramod24

+0

Parfait. Juste une petite faute de frappe: ".object". devrait être ".objects". –

2

J'ai besoin d'extraire l'étiquette qui est relié à la plupart des enregistrements dans une queryset personne donnée, ainsi que le comte.

J'ai fait face à un problème similaire auparavant. Dans mon cas, la relation m2m a été définie entre les modèles Unit et Weapon. J'ai utilisé la requête suivante pour connaître le nombre d'armes utilisées par chaque Unit et les trier dans l'ordre décroissant du nombre d'armes.

from django.db.models import Count 
q = Unit.objects.all().annotate(count = Count('weapons')).order_by('-count') 

Je régler la requête pour vos besoins ainsi:

q = User.objects.all().annotate(count = Count('tag')).order_by('-count') 
Questions connexes