(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的方式,一条一条请求数据库将数据取出。
网友评论