У меня две модели:
class FirstTable(models.Model):
name = models.CharField(...)
class SecondTable(models.Model):
examples = models.ManyToManyField(FirstTable)
У меня есть функция, которая подсчитывает, сколько раз FirstTable
используется в поле примеров SecondTable:
data = {}
for i in FirstTable.objects.all():
data[i.name] = SecondTable.objects.filter(examples__exact=i).count()
а можно ли получить те же данные одним запросом? (агрегатный или аннотированный способы)
Ты можешь сделать:
from django.db.models import Count
FirstTable.objects.annotate(examples_count=Count('secondtable')).values('name', 'examples_count')
Результатом будет:
<QuerySet [{'name': 'Name1', 'examples_count': 3}, {'name': 'Name2', 'examples_count': 10}, ..., >
это должен быть
secondtable
. См. Отредактированный ответ.