【问题标题】:Django filter queryset based on many to many extra fields modelDjango基于多对多额外字段模型过滤查询集
【发布时间】:2017-03-09 02:45:51
【问题描述】:

这是一个模型示例。

class Person(models.Model):
      name = models.CharField(max_length=128)

      def __unicode__(self):
          return self.name

class Group(models.Model):
      name = models.CharField(max_length=128)

      def __unicode__(self):
          return self.name

class Membership(models.Model):
      person = models.ForeignKey(Person)
      group = models.ForeignKey(Group)

我想获取所有 Person 对象,并为每个对象添加一列“is_member”,如果该人至少是一个组的成员,则该列的值为 True。

我尝试使用注释和计数,但我有点困惑......谢谢。

【问题讨论】:

    标签: django


    【解决方案1】:

    试试这个:

    Person.objects.annotate(
        is_member=Case(
            When(membership=True, then=True), default=False, output_field=BooleanField()
            )
        ).distinct('id')
    

    如果您想了解更多相关信息,conditional-expressions 可以帮助您。

    【讨论】:

    • 这很有趣,谢谢。但是,我不明白为什么 is_member 总是假的(我在表中有数据)
    • 哦,很好,我会要求你显示 Person.objects.annotate(qty_membership=Count('membership)) hauhahu 的结果,但没关系。
    • 这很奇怪,因为这里我只有这个字段 FieldError: Cannot resolve keyword 'foo' into field。选项有:id、membership、name,出于某种原因,您的模型使用 members_person..
    • @user1518217,您可以标记为答案并点赞吗?谢谢。
    • 我正在测试它,因为出现了问题……目前我投票赞成,因为它很有用(谢谢!)
    【解决方案2】:

    以下内容应该适合您:

    persons = []
    for p in Person.objects.all():
        if p.membership_set.all():
            p.is_member = True
        else:
            p.is_member = False
        persons.append(p)
    

    【讨论】:

      猜你喜欢
      • 2015-04-03
      • 2016-11-22
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 2020-06-16
      • 2013-05-17
      • 2019-01-12
      相关资源
      最近更新 更多