首页 > 解决方案 > 如何在不使用 for 循环的情况下对多对多字段应用过滤器

问题描述

我模型就像

class Company(models.Model):
    name = models.CharField(max_length=400, blank=True, null=True)

class Intership(models.Model):
    company = models.ForeignKey(Company)
    location = models.CharField(max_length=400, blank=True, null=True)


class Student(models.Model):
    name = models.CharField(max_length=400, blank=True, null=True)
    intership = models.ManyToManyField(Intership,null= True, blank=True)

我期待着所有在一家名为“xyz”的公司实习的学生。

我有代码

company_name = "xyz"
stds
for student in students:
    interships = student.intership.all()
    for intership in interships:
        if intership.company.name == company_name:
            stds.append(student)

是否有可能在一个查询中获得所有这些?

标签: pythondjangofiltermany-to-many

解决方案


您可以只过滤Students 本身:

Student.objects.filter(intership__company__name='xyz')

您可能想在.distinct()这里使用,否则Student同一公司的多个实习将被多次列出:

Student.objects.filter(intership__company__name='xyz').distinct()

注意:是,不是。internshipintership


推荐阅读