我有一个名为Item的模型,与用户(“所有者”)的m2m关系。
对于每个项目,我需要计算拥有它的用户。使用annotate()
就足够了但是我需要计算特定性别的所有者与每个项目的总拥有者数量之间的比率。例如,如果2个男性拥有5个用户中的项目,则比例为0.4。
最好的方法是什么?
答案 0 :(得分:3)
要使用ORM执行此操作,您需要条件聚合,这在Django中是不受支持的。 http://www.voteruniverse.com/Members/jlantz/blog/conditional-aggregates-in-django提出了一个可行的hacky解决方案。
如果您不需要按比例排序,那么您可以进行两次注释注释,然后在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文档页面上。
答案 1 :(得分:0)
就在我的脑海中,以下内容可能会起作用。如果您愿意,请继续使用它来获得完美的解决方案:
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()