首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django聚合聚合字段?

django聚合聚合字段?
EN

Stack Overflow用户
提问于 2009-11-26 19:55:05
回答 2查看 1.6K关注 0票数 2

我有一个名为Item的模型,它与User (“所有者”)有m2m关系。

对于每个项目,我需要计算拥有它的用户。使用annotate()很容易做到这一点

但然后我需要计算特定性别的所有者之间的比例和每个项目的总拥有者数量。例如,如果5个用户中有2个男性拥有该项目,则该比率为0.4

那么最好的方法是什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-04 08:15:26

要使用ORM做到这一点,您需要条件聚合,这在Django中不受支持。http://www.voteruniverse.com/Members/jlantz/blog/conditional-aggregates-in-django提出了一个可能行得通的老套解决方案。

如果不需要按比率排序,那么可以调用两次annotate,然后在Python中计算比率。类似于:

代码语言:javascript
复制
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文档页面上。

票数 3
EN

Stack Overflow用户

发布于 2009-11-27 06:24:50

就在我的头顶上,像下面这样的东西是可以工作的。如果您愿意,可以对其进行迭代以获得完美的解决方案:

代码语言:javascript
复制
items = Item.objects.annotate(Count('users'))

for item in items:
    total = item.users__count
    num_males = item.users.filter(gender='M').count()
    num_females = item.users.filter(gender='F').count()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1803262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档