我想抓住所有相关的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)
答案 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",
),
)