Python Django遵循一对多关系
我在理解如何使用Django跟踪多个层次的关系时遇到了一些困难。显然,我可以使用Python Django遵循一对多关系,python,sql,django,sqlite,join,Python,Sql,Django,Sqlite,Join,我在理解如何使用Django跟踪多个层次的关系时遇到了一些困难。显然,我可以使用进行循环,但我正试图找到一种更有效的方法(可能求助于原始SQL)。模型大致如下: 主题->课程->模块->问题 它们通过外键链接(例如,问题模块有一个外键指向模块) 以下方法可行,但速度相当缓慢,当然也不理想: subject=“数学” courses=Subject.objects.get(name\u iexact=Subject.courses\u set.all() 平均得分=[] 课程中的课程: 模块=课程
进行循环,但我正试图找到一种更有效的方法(可能求助于原始SQL)。模型大致如下:
主题->课程->模块->问题
它们通过外键链接(例如,问题
模块有一个外键指向模块
)
以下方法可行,但速度相当缓慢,当然也不理想:
subject=“数学”
courses=Subject.objects.get(name\u iexact=Subject.courses\u set.all()
平均得分=[]
课程中的课程:
模块=课程模块集合所有()
对于模块中的模块:
questions=module.question\u set.all().filter(num\u尝试次数\u gt=20)。filter(平均分数\u gt=0)。exclude(平均分数\u isnull=True)。order_by('avg\u分数'))
有关问题:
平均分数。附加(问题)
我可以使用SQL通过以下方式实现这一点:
从问题中选择*
内连接模
关于问题。module_id=module.id
内连接层
在模块上。课程号=课程号
内连接主语
ON course.subject\u id=subject.id
其中subject.name=“数学”
尝试次数>20次
平均得分>0
有没有一种方法可以做到:
Question.objects.filter(module__course__subject__name = 'Mathematics',
num_attempts__gt = 20,
avg_score__gt = 0).order_by('avg_score')
avg\u scores=Subject.objects.get(name\u iexact=“Mathematics”).course\u set.module\u set.question\u set.filter(num\u尝试次数\u gt=20)、filter(avg\u scores\u gt=0)、exclude(avg\u scores\u isnull=True)、order\u by('avg\u scores'))
如果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')
谢谢我想我没注意到医生的位置。对于未来的读者来说,这些文档是:对于
循环,这要比快得多,原因很明显:-)