queryset高级用法:prefetch_related

这个方法和select_related方法类型,就是访问多个表中的数据的时候,减少查询的次数。这个方法是为了解决一对多和多对多的关系的查询问题。比如要获取标题中带有hello字符串的文章以及它的所有标签。示例代码

from django.db import connection
articles = Article.objects.prefetch_related('tag_set').filter(title__contains='hello')
print(articles.query) # 通过这条命令查看底层执行的sql语句
for article in articles:
      print('title:', article.title)
      print(article.tag_set.all())

# 通过以下代码可以看出以上代码的sql语句
for sql in connection.queries:
      print(sql)

但是如果在使用article.tag_set的时候,如果又创建了一个新的QuerySet那么会把之前的sql优化给破坏掉。比如以下代码:

tags = Tag.objects.prefetch_related('articles')
for tag in tags:
      articles = tag.articles.filter(title__contains='hello') #因为filter方法会重新生成一个QuerySet,因此会破坏掉之前的sql

# 通过以下代码,我们可以看到在使用了filter,它的sql查询会更多,而没有使用filter,只有两次sql查询
for sql in connection.queries:
      print(sql)
原文地址:https://www.cnblogs.com/weiweivip666/p/13837677.html