【问题标题】:Django - Filter on ManyToManyFieldDjango - 在 ManyToManyField 上过滤
【发布时间】:2022-11-25 01:32:07
【问题描述】:

我有两个模型:

class Student(models.Model):
    first_name = models.CharField()
    last_name = models.CharField()


class Group(models.Model):
    name = models.CharField()
    students = models.ManyToManyField(Student)

一些数据(first_namelast_name 串联):

Group #1 | Blak Coleman
Group #1 | Miguel Scott
Group #2 | Jordan Barnes
Group #2 | Jordan Gustman
Group #2 | Jekson Barnes
Group #3 | Jordan Smith

如您所见,有三个学生的名字是Jordan。所以我需要返回 students 查询集中只有学生姓名 Jordan 的组。

我试过这个:

groups = Group.objects.filter(students__first_name='Jordan')

但是 group.first().students.all() 包含所有学生,而不仅仅是 Jordan。预期结果:

Group #2 | Jordan Barnes
Group #2 | Jordan Gustman
Group #3 | Jordan Smith

我怎么能这样做?

【问题讨论】:

  • 什么意思但是 group.first().students.all() 包含所有学生,而不仅仅是乔丹
  • 结果集名称是 groups - 复数。 group.first().students.all() - 此代码忽略您的结果集。它指的是group而不是groups。显示与问题相关的完整代码。
  • 你能回答我上面的评论吗?
  • @SunderamDubey,我发布了我找到的解决方案stackoverflow.com/a/74561823/9112151

标签: django django-orm


【解决方案1】:

这有效:

from django.db.models import Prefetch

students = Student.objects.filter(first_name='Jordan')
prefetch = Prefetch('students', queryset=students)
groups = Group.objects.prefetch_related(prefetch)
groups = [group for group in groups if len(group.students.all())]

【讨论】:

  • 很高兴您找到解决方案 +20 声望 :) 但您还应该编辑问题并明确您的问题,以便它可以帮助未来的读者。
【解决方案2】:

尝试这个:

groups = Group.objects.filter(students__first_name__in=['Jordan'])

【讨论】:

  • 结果是一样的
【解决方案3】:

对于所有学生,您可以像这样编写查询...

groups = Group.objects.filter(students__id__in=[i.id for i in Students.objects.all()])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2019-12-04
    • 2011-01-08
    • 2018-07-25
    • 2021-06-16
    • 2014-06-12
    • 1970-01-01
    相关资源
    最近更新 更多