在Django中按关系字段过滤多对多关系

Posted

技术标签:

【中文标题】在Django中按关系字段过滤多对多关系【英文标题】:Filtering Many-to-Many relationship by Relationship field in Django 【发布时间】:2012-10-05 04:07:28 【问题描述】:

我正在尝试通过一些通过类字段过滤多对多关系。

引用 Django 文档,我将解释我的目标

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)
      members = models.ManyToManyField(Person, through='Membership')

      def __unicode__(self):
          return self.name

class Membership(models.Model):
      person = models.ForeignKey(Person)
      group = models.ForeignKey(Group)
      date_joined = models.DateField()
      invite_reason = models.CharField(max_length=64)

在这个例子中,我的目标是过滤多对多关系,并仅获取从某个日期开始加入某个 GroupPersondate_joined 字段)。

有可能吗?

【问题讨论】:

【参考方案1】:

您可以query across relationships 与 django ORM(或在本例中为反向关系):

person = Person.objects.filter(
    membership__group=example_group,
    membership__date_joined__gte=example_date
)

【讨论】:

这比我们做不到的有点棘手Group.objects.filter(members__date_joined=...),所有的查询都是从模型中的显式字段进行的。非常感谢【参考方案2】:

你也可以这样做:

person = example_group.members.filter(
    membership__date_joined__gte=example_date
)

【讨论】:

以上是关于在Django中按关系字段过滤多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在引导选项卡块中按 django 模板中的多对多字段过滤对象

Django 多对多字段过滤器列表

如何在 Eloquent ORM 中按多对多关系的数据透视表的字段进行排序

在 Django Admin 中过滤多对多框

如何过滤和访问 Django QuerySet 中的多对多字段?

Django内联表单集通过另一个模型在多对多关系中过滤