Джанго: как объединять / аннотировать отношения «многие ко многим»? - PullRequest
6 голосов
/ 01 сентября 2010

У меня есть модель Person и модель Tag с площадью m2m между ними.

Мне нужно извлечь тег, который связан с большинством записей в заданном наборе запросов Person, вместе со счетчиком.

Существует ли элегантный и эффективный способ извлечь это с помощью Django ORM?

А еще лучше, есть ли способ получить полное распределение тегов через некоторую аннотацию?Как можно вытащить все объекты, связанные с подмножеством объектов, подключенных через м2?

Спасибо!

Ответы [ 2 ]

7 голосов
/ 02 сентября 2010

Это даст вам самый частый тег:

from django.db.models import Count
Tag.objects.filter(person__yourcriterahere=whatever [, morecriteria]).annotate(cnt=Count('person')).order_by('-cnt')[0]
2 голосов
/ 01 сентября 2010

Мне нужно извлечь тег, который связан с большинством записей в данном наборе запросов Person, вместе с количеством.

Я сталкивался с подобной проблемой раньше. В моем случае отношение m2m было определено между моделями Unit и Weapon. Я использовал следующий запрос, чтобы узнать количество оружия, используемого каждым Unit, и отсортировать их по убыванию количества оружия.

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

Я бы изменил запрос для вашего требования так:

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