如何避免Django中因__str__函数产生的重复SQL查询?
解决Django外键显示导致重复SQL查询的问题
你的问题核心是Django的N+1查询问题:因为SectionList的__str__方法调用了clean_sections.name,当你在模板中遍历SectionList实例时,每一个实例都会单独触发一次查询去获取对应的CleanSections数据,最终导致38次重复查询。
解决方法很直接,就是在查询SectionList时预取关联的clean_sections数据,用Django的select_related方法:
具体实现步骤
- 在视图中查询
SectionList数据时,添加select_related('clean_sections'),把关联的外键数据一次性拉取回来:
# 视图中的查询代码示例 section_lists = SectionList.objects.select_related('clean_sections').all()
- 把这个查询集传到模板后,不管是调用
__str__显示名称,还是直接访问clean_sections.name,都不会再触发新的SQL查询了。
原理说明
select_related会通过SQL的JOIN语句,在查询主模型(SectionList)的同时,把关联的外键模型(CleanSections)的数据一起查询出来,一次性加载到内存中,避免了每次访问外键字段时都单独发SQL请求。
如果以后遇到多对多关系或者反向外键的类似问题,可以用prefetch_related,不过你的场景是正向一对一/外键,select_related完全够用。
内容的提问来源于stack exchange,提问作者Zesshi
相关产品推荐
相关产品推荐

