Django:如何查询列表中存在多个字段ALL的对象?

时间:2017-03-03 20:00:11

标签: python django list filter many-to-many

我想抓住所有相关的prereq_courses存在于提供的列表(称为course_codes)中的程序。所以我不希望包含在该列表中不存在的prereq_courses的程序。我该怎么做?

models.py

class Course(models.Model):
    name = models.CharField(max_length=255, blank=True)
    code = models.CharField(max_length=64, blank=True, unique=True)

class Prerequisite(models.Model):
    program = models.ForeignKey('Program', on_delete=models.CASCADE)
    course = models.ForeignKey('Course', on_delete=models.CASCADE, null=True)
    group = models.IntegerField(null=True, default=0)

class Program(models.Model):
    name = models.CharField(max_length=255)
    prereq_courses = models.ManyToManyField(Course, through=Prerequisite)

我尝试了以下内容,但它也为我提供了包含course_codes列表中不存在的prereq_courses的程序。

for code in course_codes: 
    eligible_progs = eligible_progs.filter(prereq_courses__code=code)

2 个答案:

答案 0 :(得分:2)

django中有in field lookup转换为IN operator in SQL

eligible_programs = eligible_progs.filter(prereq_courses__course__code__in=course_codes)

您还应注意,如果models属性为__,则使用ForeignKeyField告诉django ORM在幕后连接表。

答案 1 :(得分:0)

我在docs

中找到了解决方案

为了测试列表中所有课程的存在,我基本上必须反过来做。首先,我得到了所有UNTAKEN课程的查询集。然后我排除了具有必修课程的课程,这些课程是未学习课程查询集的一部分。我添加了另一个参数,所以我不得不使用filter()操作。它就像一个魅力。

not_taken_courses = Course.objects.exclude(code__in=course_codes)

eligible_programs = eligible_progs.exclude( 
     prerequisite__in=Prerequisite.objects.filter( 
        course__in=not_taken_courses, relation_type = "Alone", 
     ), 
)