我有一个名为 Item
的模型,与 User
(“所有者”)具有 m2m 关系。
对于每个项目,我需要计算拥有它的用户数量。使用 annotate()
但是我需要计算每个项目的特定性别所有者与所有者总数之间的比率。例如,如果 5 位用户中有 2 位男性拥有该商品,则比例为 0.4
。
最好的方法是什么?
最佳答案
要使用 ORM 执行此操作,您需要条件聚合,而 Django 不支持条件聚合。 http://www.voteruniverse.com/Members/jlantz/blog/conditional-aggregates-in-django提出了一个可能有效的 hacky 解决方案。
如果不需要按比率排序,则可以调用两次 annotate,然后在 Python 中计算比率。像这样的东西:
items = Item.objects.annotate(ucount=Count('users')).annotate(ccount=CountIf(<condition>))
for item in items:
item.ratio = item.ucount / item.ccount
如果您不想这样做,我建议您使用 extra()
方法和一些自定义 sql 来获取您想要的额外信息。该方法的文档位于 Django Queryset API 文档页面。
关于django聚合聚合字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1803262/