Django: как агрегировать / аннотировать отношения «многие ко многим»?

У меня есть модель Person и модель Tag, с м2м между ними.

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

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

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

Спасибо!

8
задан GJ. 31 August 2010 в 20:44
поделиться

2 ответа

Это даст вам наиболее часто встречающийся тег:

from django.db.models import Count
Tag.objects.filter(person__yourcriterahere=whatever [, morecriteria]).annotate(cnt=Count('person')).order_by('-cnt')[0]
7
ответ дан 5 December 2019 в 15:16
поделиться

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

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

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')
4
ответ дан 5 December 2019 в 15:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: