簡體   English   中英

Django:如何查詢列表中存在多個字段的對象?

[英]Django: How to query objects where manytomany fields ALL exist in a list?

我想獲取所有相關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)

在django中有一個in字段查找 ,該查找轉換為SQL中IN運算符

eligible_programs = eligible_progs.filter(prereq_courses__course__code__in=course_codes)

您還應該注意,如果models屬性是ForeignKeyField ,則使用__告訴django ORM在后台連接表。

我在文檔中找到了解決方案

為了測試列表中所有課程的存在,我基本上必須反向進行。 所以首先,我得到了所有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", 
     ), 
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM