【问题标题】:Django Follow One-To-Many RelationshipsDjango 遵循一对多关系
【发布时间】:2013-11-03 13:34:17
【问题描述】:

我在理解如何使用 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')

【问题讨论】:

    标签: python sql django sqlite join


    【解决方案1】:

    如果您的 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')
    

    【讨论】:

    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2018-08-28
    • 2013-04-06
    相关资源
    最近更新 更多