使用 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()
吗?
我还注意到在我的开发机器和 SQLite 上执行aggregate()
最后一个count()
比在使用 Postgresql 的登台服务器上更快,这有点奇怪,但这不是我现在主要关心的问题。