【问题标题】:Quick counting with linked Django Models使用链接的 Django 模型快速计数
【发布时间】:2010-09-28 17:24:38
【问题描述】:

我有一堆类似这样的模型(我正在用相对简写形式打出来):

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 方法,我对纯 SQL 方法感到满意,但我真的不想陷入每个用户发出 n + 1 个查询的情况(其中 n 是用户拥有的列表数量)只是为了计数......

编辑:我没有使用“真正的”models.ManyToMany(..) 关系,因为我在 ItemListOwnership 中定义了其他东西,这些东西更好地描述了这种关系。如果它是杀手,我可能会将此元数据移动到其他地方并摆脱 ItemListOwnership 并在 ItemList 中插入 m2m

【问题讨论】:

    标签: python sql django django-models


    【解决方案1】:

    首先,在链接表中定义额外的字段是through 的功能ManyToManyField 的用途。因此,保留您的 ItemListOwnership 表及其 FK,但将 userlist=ManyToMany('User', through='ItemListOwnership') 添加到 UserList

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 2012-09-22
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      相关资源
      最近更新 更多