django select_related prefetch_related

(1)、也就是说使用select_related()方法一次性的把Book关联的对象都查询出来放入对象中,再次查询时就不需要再连接数据库,节省了后面查询数据库的次数和时间。

(2)、当我们想通过Publisher查询出版的书的时候(反向查)
    publisher_queryset = Publisher.objects.get(id=1)
    info = publisher_queryset.p_book_set.all()
    print(info)# 访问一次
    print(info)# 再次访问
    通常情况来讲,调用可调用的属性每次都会访问数据库
    我们可以通过prefetch_related来进行优化:

sql1: SELECT `django_learn_publisher`.`id`, `django_learn_publisher`.`name`, `django_learn_publisher`.`num_awards` FROM `django_learn_publisher`; 
sql2 : SELECT `django_learn_book`.`id`, `django_learn_book`.`name`, `django_learn_book`.`pages`, `django_learn_book`.`price`, `django_learn_book`.`rating`, `django_learn_book`.`publisher_id`, `django_learn_book`.`pubdate` FROM `django_learn_book` WHERE `django_learn_book`.`publisher_id` IN (1, 2, 3, 4, 5);
解释: prefetch_related 采用的是用in的方式将数据全部取出,而如果不使用prefetch方式是sql采用的是where id = x的方式,一条一条请求数据库将数据取出。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容