gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:57:10 25 4
gpt4 key购买 nike

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

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

最佳答案

首先,在链接表中定义额外字段是 ManyToManyFieldthrough 功能的用途。因此,保留 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com