Агрегатный запрос Django с фильтрами
У меня есть две таблицы Template и Tracker с отношением один ко многим. Мне нужно показать все загруженные шаблоны для определенного пользователя. Также мне нужно упорядочить их по количеству загрузок.
Я попробовал следующий запрос. но он не получает количество всех загруженных файлов.
Template.objects.filter(tracker__type='upload', user_id=300).annotate(
download_count=Count(
'tracker',
filter=Q(tracker__type='download')
)
).order_by("-download_count")
Шаблон таблицы
id | title | description |
---|---|---|
1 | AAA | AAA |
2 | AAA | AAA |
3 | AAA | AAA |
Таблица трекеров
id | type | user_id | template_id |
---|---|---|---|
1 | download | 100 | 1 |
2 | download | 200 | 1 |
3 | upload | 300 | 1 |
Вы можете фильтровать с помощью Exists
подзапроса [Django-doc] и затем аннотировать Template
s:
from django.db.models import Count, Exists, OuterRef
Template.objects.filter(
Exists(Tracker.objects.filter(
template_id=OuterRef('pk'), user_id=300, tracker_type='upload'
))
).annotate(
total_downloads=Count('tracker', filter=Q(tracker__type='download'))
).order_by('-total_downloads')
Это вернет QuerySet
из Template
объектов, которые были загружены пользователем с первичным ключом 300
и эти Template
объекты будут содержать дополнительный атрибут .total_downloads
, который будет перечислять количество загрузок для этого Template
.