Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django遵循一对多关系_Python_Sql_Django_Sqlite_Join - Fatal编程技术网

Python 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() 平均得分=[] 课程中的课程: 模块=课程

我在理解如何使用Django跟踪多个层次的关系时遇到了一些困难。显然,我可以使用
进行
循环,但我正试图找到一种更有效的方法(可能求助于原始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')

谢谢我想我没注意到医生的位置。对于未来的读者来说,这些文档是:对于
循环,这要比
快得多,原因很明显:-)