【问题标题】:Django - Annotate with count across ManytoMany relationships (refrase)Django - 在多对多关系中使用计数进行注释(refrase)
【发布时间】:2019-11-16 20:08:44
【问题描述】:

Django - Annotate with count across ManytoMany relationships

我无法找到使用元素在多对多关系中使用次数的计数来注释查询集的方法。

class Profile(models.Model):
    [...]
    # Profile can have multiple roles
    roles = models.ManyToManyField('Role', blank=True)
    [...]

class Role(models.Model):
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    name = models.CharField(blank=True, max_length=30)
    description = models.CharField(blank=True, max_length=300)
    [...] 

例如,我将有 5 个角色:

  • 角色1
  • 角色2
  • 角色3
  • 角色4
  • 角色5

还有 2 个配置文件,分配了以下角色:

  • 简介1
    • 角色 1
    • 角色 2
  • 个人资料2
    • 角色 1
    • 角色 3
    • 角色 4

我需要比@ha-duy 对面:

Profile: name, role_count=2
Profile: name, role_count=3

有什么想法吗?

谢谢!

【问题讨论】:

    标签: django django-annotate


    【解决方案1】:

    一个想法:

    在同一个视图中,您通过多对多字段更新滚动循环并返回长度。然后适当地更新模型。

    更好的主意:

    为配置文件模型创建自定义保存方法,以便每次调用 .save() 时都会计算角色数量并更新该字段。 更多信息在这里。 custom save method on model - django

    也许这会有所帮助,因为它不会在数据库中持久存在,但会为您提供信息:

    class Test(models.Model):
    name = models.CharField(max_length=10,)
    category = models.ManyToManyField(cats)
    
    def __str__(self):
        x = self.category.all()
        y = len(x) 
        return 'this is an item count ' + str(y)
    

    或者如果你想要对象形式:

    将此添加到模型中。

        def dataBlock(self):
           x = self.category.all()
           y = len(x) 
           return {
               'name': self.name,
               'cat_length': y,
           }
    

    【讨论】:

    • 感谢@cr-python 的回复,我知道它不在问题描述中,但我正在寻找不存在于数据库中的东西。角色计数是一个示例,我需要解决与其他列相同的情况,例如获取较长角色名称的描述。
    • 我遵循了您在数据库中保存计算值的“更好的想法”并且它正在工作。感谢!当调用 m2m_changed 信号时,我正在更新值
    猜你喜欢
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2011-04-06
    • 2016-06-17
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多