Агрегатный запрос 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] и затем аннотировать Templates:
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.