两种型号:
class University(models.Model):
name = models.CharField("name", max_length = 48)
city = models.ForeignKey(City, on_delete = models.CASCADE)
class Course(models.Model):
name = models.CharField("course name", max_length = 48)
university = models.ForeignKey(University, on_delete = models.CASCADE)
students = models.ManyToManyField(Student, related_name = "%(class)s_name", related_query_name = "student_course_qs", blank = True)
online = models.BooleanField("online course", default = False)
semester = models.PositiveIntegerField("choose 1-6", default = 1, choices = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)])
time_update = models.DateTimeField("last info update", auto_now = True)
限制条件:如果Course
具有students
,则它不能是online
,反之亦然。
如何获得给定city
的所有Universities
上的所有Courses
的列表,其中Course
上的最新条目包含students
,而Course
包含在第三个semester
中?
我尝试过在University
的不同组上循环,但这会导致大量的查询:
universities = University.objects.filter(city = City.objects.first())
wanted = []
for univ in universities:
c = Course.objects.filter(university = univ).order_by("time_update").last()
if c.semester == 3 and not c.online:
wanted.append(c.id)
selected_courses = Courses.objects.filter(id__in = wanted)
我在这里看到的问题是,我创建了太多的查询,并且在universities
的过滤器之后,它们就已经被分组了-我可以一个接一个地处理这些组而不重新创建查询吗?
1条答案
按热度按时间ct3nt3jp1#
您可以使用子查询:
这里我们首先为每个
University
选择最后一个Course
的主键,然后我们可以在JOIN的过滤中使用它,最后我们用一个额外的查询获取Courses
。