我有一堆像这样的模型(我用相对简写形式输入):
class User:
pass
class ItemList:
pass
# A User can have more than one ItemList
# An ItemList can have more than one User
# Classic M2M
class ItemListOwnership:
user = fk(User)
itemlist = fk(ItemList)
# An ItemList has multiple Items
class Item:
itemlist = fk(ItemList)
我想要做的是显示给定用户(或现有用户查询集)在其各种列表中拥有多少项目的简单计数。 我需要跨越 M2M 鸿沟。
这就是我被困住的地方。我对纯 SQL 方法很满意,如果这是唯一有效的方法,但我真的不想陷入每个用户发出 n + 1 个查询的情况(其中 n 是用户拥有的列表数量)只是为了计数...
编辑:我没有使用“真正的”models.ManyToMany(..)
关系,因为我在 ItemListOwnership
中定义了其他内容,可以更好地描述该关系。如果它是一个 killer ,我可能可以将此元数据移到其他地方并摆脱 ItemListOwnership
并将 m2m 粘贴到 ItemList
最佳答案
首先,在链接表中定义额外字段是 ManyToManyField
的 through
功能的用途。因此,保留 ItemListOwnership 表及其 FK,但将 userlist=ManyToMany('User', through='ItemListOwnership')
添加到 UserList
。
完成此操作后,您可以使用注释轻松计算每个用户的项目数量:
from django.db.models import Count
User.objects.all().annotate(item_count=Count('userlist__item'))
现在每个用户都有一个 item_count
属性,即他们拥有的商品数量。
关于python - 使用链接的 Django 模型快速计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3815395/