django - Django ORM:如何使用带注释字段的过滤器进行聚合?
问题描述
我查看了统计信息,其中我计算count
了一些基本查询集的不同过滤器上的多个 's:
qs = Model.onjects.filter(...).annotate(a=...)
a = qs.filter(Q(a__lt=5)).count()
b = qs.filter(Q(a__lt=10)).count() # this is just an example, real filters are more complex
...
但是每个计数都会对数据库进行单独的查询,我想对其进行优化。我试过aggregation
:
qs.aggregate(
a=Count('a', filter=Q(a__lt=5)),
b=Count('a', filter=Q(a__lt=10)),
)
但有一个错误:django.db.utils.OperationalError: (1054, "Unknown column '__col2' in 'field list'")
。我什至不知道这__col2
是从哪里来的。
似乎聚合不适用于注释,因为当我在内部使用常规模型字段count.filter
而不是注释字段时,a
一切都很好。
解决方案
如果您使用的是 Django 2.2,那么您的方法应该有效,如此处所述。你可能应该指望'pk'
那里显示,不确定你可以指望注释本身:
qs.aggregate(
a=Count('pk', filter(Q(a__lt=5)),
b=Count('pk', filter(Q(a__lt=10))
)
如果您使用的是 Django 1.11,则上述方法不起作用,因为Count
将始终返回 1,忽略过滤器。你应该使用Case ... When
:
qs.aggregate(
a=Sum(
Case(When(a__lt=5, then=1),
output_field=IntegerField())
),
b=Sum(
Case(When(a__lt=10, then=1),
output_field=IntegerField())
)
)
推荐阅读
- python - dev_appserver.py 找不到我的 app.yaml
- java - 在 caputrue 后裁剪图像或从图库中拾取
- python - PyTorch - 如何在训练期间获得学习率?
- ios - 是否可以在 ios 的 mapView 上集群 MKPolygon
- javascript - 'executeOperation' 中的最后一个参数必须是回调错误 MongoClient.connect()
- npm - 将参数从脚本传递给 gulp 任务
- android - 服务被停止
- css - 如何让用户看到 Azure B2C 登录中的必填字段
- sql-server - 使用 SQL 执行匹配和索引功能
- javascript - MapBox如何创建MarkerCluster