我有一个名为Item的模型,它与User (“所有者”)有m2m关系。
对于每个项目,我需要计算拥有它的用户。使用annotate()很容易做到这一点
但然后我需要计算特定性别的所有者之间的比例和每个项目的总拥有者数量。例如,如果5个用户中有2个男性拥有该项目,则该比率为0.4。
那么最好的方法是什么呢?
发布于 2009-12-04 08:15:26
要使用ORM做到这一点,您需要条件聚合,这在Django中不受支持。http://www.voteruniverse.com/Members/jlantz/blog/conditional-aggregates-in-django提出了一个可能行得通的老套解决方案。
如果不需要按比率排序,那么可以调用两次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文档页面上。
发布于 2009-11-27 06:24:50
就在我的头顶上,像下面这样的东西是可以工作的。如果您愿意,可以对其进行迭代以获得完美的解决方案:
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()https://stackoverflow.com/questions/1803262
复制相似问题