簡體   English   中英

Django遵循一對多的關系

[英]Django Follow One-To-Many Relationships

我在理解如何使用Django關注多層關系方面遇到了一些麻煩。 顯然我可以使用for循環,但我正在嘗試找到一種更有效的方法(可能采用原始SQL)。 該模型大致是:

Subject -> Course -> Module -> Question

他們通過外鍵(例如鏈接的Question模塊有一個外鍵指向一個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')

如果您的SQL查詢將啟動SELECT * FROM Model ...那么您的Django查詢通常應該啟動Model.objects.filter(...) 所以在這種情況下你需要這樣的東西:

Question.objects.filter(module__course__subject__name = 'Mathematics',
                        num_attempts__gt = 20,
                        avg_score__gt = 0).order_by('avg_score')

暫無
暫無

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

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