Пользовательский подсчет Django на основе фильтра ORM - PullRequest
1 голос
/ 04 октября 2019

Я пытаюсь собрать дополнительную информацию на основе ранее отфильтрованных данных, например:

count(distinct batch_id) as batches,
sum(files) as files

На результат влияет предыдущая фильтрация, например.

.filter(batch_id__gte=165)

Я пытался клонироватьQuerySet и аннотации над SQL

.annotate(
        batches=Count('batch_id', distinct=True),
        batch_files=Sum('files')
    )

, но это не работает, потому что тогда SQL добавляется к существующему запросу SELECT

Есть ли простой способ получить второй запрос спользовательская часть SELECT с сохранением части WHERE?

1 Ответ

0 голосов
/ 04 октября 2019

Вы, вероятно, хотите aggregate(..) [Django-doc] вместо этого, например:

result = Model.objects.filter(batch_id__gte=165).<b>aggregate(</b>
    batches=Count('batch_id', distinct=True),
    batch_files=Sum('files')
<b>)</b>

result - это словарь, содержащий дваключи: 'batches' и 'batch_files', которые содержат Count('batch_id', distinct=True) и Sum('files') соответственно.

Аннотирование означает, что вы будете вычислять свойства для объекта , а не для всего набора запросов,тогда как агрегат означает, что вы рассчитываете агрегат по всему (отфильтрованному) набору запросов.

...