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

标签 python sql django django-models

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

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/

相关文章:

python - 查找 ValueError : need more than X values to unpack 的缺失值

c# - 在 ASP.Net 应用程序中安全地存储(加密)数据

python - 如何解决没有函数与给定名称和参数类型匹配的问题。您可能需要添加显式类型转换

django respite + backbone 在获取 url 时搞砸了

python - 为什么我在过滤时会在 Django 中看到重复的模型对象? Python

python - 如何将命令行工具添加到python包

php - 使用 python 或 php 处理音频文件

python - 解析 json 响应以获取父/子字典

mysql - 通过复制现有行将新行插入表中

python - 存储句子中有趣的单词