我在理解如何使用 Django 遵循多个级别的关系时遇到了一些麻烦。显然我可以使用for
循环,但我正试图找到一种更有效的方法来做到这一点(可能诉诸原始 SQL)。模型大致为:
Subject -> Course -> Module -> Question
它们通过外键链接(例如,Question
模块有一个指向 a 的外键Module
)。
以下工作,但很慢,当然不理想:
subject = "Mathematics"
courses = Subject.objects.get(name__iexact=subject).course_set.all()
avg_scores = []
for course in courses:
modules = course.module_set.all()
for module in modules:
questions = module.question_set.all().filter(num_attempts__gt=20).filter(avg_score__gt=0).exclude(avg_score__isnull=True).order_by('avg_score')
for question in questions:
avg_scores.append(question)
我可以使用以下 SQL 来执行此操作:
SELECT * FROM question
INNER JOIN module
ON question.module_id=module.id
INNER JOIN course
ON module.course_id=course.id
INNER JOIN subject
ON course.subject_id = subject.id
WHERE subject.name="Mathematics"
AND num_attempts > 20
AND avg_score > 0
有没有办法有类似的东西:
avg_scores = Subject.objects.get(name__iexact="Mathematics").course_set.module_set.question_set.filter(num_attempts__gt=20).filter(avg_score__gt=0).exclude(avg_score__isnull=True).order_by('avg_score')