(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的方式,一條一條請求數據庫將數據取出。