使用链接的Django模型快速计数

2024-10-04 01:36:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一堆这样的模型(我用相对简写的方式输入):

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


Tags: 用户anmorehavepassonecanclass
1条回答
网友
1楼 · 发布于 2024-10-04 01:36:09

首先,在链接表中定义额外字段是throughManyToManyField功能的目的。因此,保留ItemListOwnership表及其FKs,但是在userlist=ManyToMany('User', through='ItemListOwnership')中添加一个UserList

完成此操作后,可以使用annotate轻松计算每个用户的项目数:

from django.db.models import Count
User.objects.all().annotate(item_count=Count('userlist__item'))

现在每个用户都有一个item_count属性,即他们拥有的项目数

相关问题 更多 >