Использование Django rest framework 3.x и Django 1.1.10
. У меня есть модель, которая представляет пользователей. Когда я перечисляю всех пользователей, обращаясь к конечной точке /users/
в DRF, список должен включать некоторые дополнительные данные, связанные с пользователями через другую модель, называемую владельцем. У каждого элемента есть владелец, а у владельцев есть пользователи.
Я сделал дополнительное свойство в модели User, и оно просто возвращает массив данных JSON. Это то, что я не могу изменить, потому что это требование внешнего интерфейса. Я должен вернуть общее количество элементов, связанных с каждым пользователем, и для получения данных нужно выполнить три разных подсчета.
Мне нужно получить несколько элементов count() для одной и той же модели, но с разными условиями.
Делать это по отдельности легко, два тривиальны, а последний сложнее:
Item.objects.filter(owner__user=self).count()
Item.objects.filter(owner__user=self, published=True).count()
Item.objects.filter(Q(history__action__name='argle') | Q(history__action__name='bargle'),
history__since__lte=now,
history__until__gte=now,
owner__user=self).count()
Проблема в том, что это запускается для каждого пользователя, а их много. В конце концов это генерирует более 300 запросов к БД, и я хотел бы свести их к минимуму.
Пока я придумал это:
Item.objects.filter(owner__user=self)\
.aggregate(published=Count('published'),
total=Count('id'))
Это объединит первые два счетчика, вернет их, и в базе данных будет выполнено только одно SELECT
. Есть ли способ включить последний вызов count()
в тот же самый aggregate()
?
Я пробовал много вещей, но это кажется невозможным. Должен ли я просто написать собственный SELECT
и использовать Item.objects.raw()
?
Я также заметил, что выполнение aggregate()
и последнего count()
выполняется быстрее на моем компьютере для разработки и SQLite, чем на промежуточном сервере с Postgresql, что немного странно, но сейчас это не моя главная задача.