Django多对一关系下如何获取指定Reporter列表关联的全部Article数据
Django多对一关联批量查询正确实现
原代码存在的问题
- 字段名错误:
Article模型中关联Reporter的外键字段名为reporter,原代码filter参数误写为report,无法匹配字段导致查询不到数据 - 结果结构错误:原代码每次循环将单个
Reporter对应的QuerySet对象append到列表中,最终得到的是QuerySet组成的嵌套结构,而非合并后的Article对象集合 - 性能问题:循环内每次执行数据库查询,Reporter数量多的时候会产生大量数据库请求,性能极差
正确实现(最优方案)
直接使用__in查询,单次请求即可获取所有关联的Article数据:
articles = Article.objects.filter(reporter__in=reports)
该写法返回的是包含所有目标Article的QuerySet,可直接遍历使用,也可调用list(articles)转为Python列表,性能远高于循环查询
循环写法修正(不推荐,仅做示例)
如果一定要用循环实现,需要修正字段名并使用extend拼接结果:
articles = [] for report in reports: # 修正字段名为模型实际定义的reporter reporter_articles = Article.objects.filter(reporter=report) # 用extend将QuerySet中的Article对象逐个加入列表,而非append整个QuerySet articles.extend(reporter_articles)
内容的提问来源于stack exchange,提问作者Watson
相关产品推荐
相关产品推荐

