我有一堆这样的模型(我用相对简写的方式输入):
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
中定义了一些描述关系的附加内容。如果它是一个杀手,我可以把这个元数据移到别处,去掉ItemListOwnership
,在ItemList
中插入一个m2m
首先,在链接表中定义额外字段是
through
的ManyToManyField
功能的目的。因此,保留ItemListOwnership表及其FKs,但是在userlist=ManyToMany('User', through='ItemListOwnership')
中添加一个UserList
完成此操作后,可以使用annotate轻松计算每个用户的项目数:
现在每个用户都有一个
item_count
属性,即他们拥有的项目数相关问题 更多 >
编程相关推荐