我有一个名为 的模型Item
,与User
(“所有者”)有 m2m 关系。
对于每个项目,我需要计算拥有它的用户。这很容易annotate()
但是然后我需要计算每个项目的特定性别所有者与总所有者数之间的比率。例如,如果 5 个用户中有 2 个男性拥有该项目,则比率为0.4
。
最好的方法是什么?
我有一个名为 的模型Item
,与User
(“所有者”)有 m2m 关系。
对于每个项目,我需要计算拥有它的用户。这很容易annotate()
但是然后我需要计算每个项目的特定性别所有者与总所有者数之间的比率。例如,如果 5 个用户中有 2 个男性拥有该项目,则比率为0.4
。
最好的方法是什么?
要使用 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 文档页面上。
就在我的头上,类似下面的东西可以工作。如果您愿意,请对其进行迭代以获得完美的解决方案:
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()