실전 Django의 모델 조작의 selectrelated 및 prefetchrelated 모범 사례 (3)

이것은 이 시리즈의 마지막 편으로 주로 select 이다related() 및 prefetchrelated ()의 모범 사례
여기
1편은 여기서 예와 select 을 강의합니다.related()
2편은 여기서 프리페치related()
4. 일부 인스턴스
함수 선택
만약에 우리가 모든 고향이 호북인 사람을 얻고 싶다면 가장 머리 없는 방법은 먼저 호북성을 얻은 다음에 호북성의 모든 도시를 얻고 마지막에 고향이 이 도시의 사람을 얻는 것이다.다음과 같이 하십시오.

    
    
    
    
  1. >>> hb = Province.objects.get(name__iexact= u" ")
  2. >>> people = []
  3. >>> for city in hb.city_set.all():
  4. ... people.extend(city.birth.all())
  5. ...
, 1+( ) SQL 。 , 。

prefetch_related() , 。

    
    
    
    
  1. >>> hb = Province.objects.prefetch_related( "city_set__birth").objects.get(name__iexact= u" ")
  2. >>> people = []
  3. >>> for city in hb.city_set.all():
  4. ... people.extend(city.birth.all())
  5. ...
2 prefetch, 3 SQL :

    
    
    
    
  1. SELECT `QSOptimize_province`. `id`, `QSOptimize_province`. `name`
  2. FROM `QSOptimize_province`
  3. WHERE `QSOptimize_province`. `name` LIKE ' ' ;
  4. SELECT `QSOptimize_city`. `id`, `QSOptimize_city`. `name`, `QSOptimize_city`. `province_id`
  5. FROM `QSOptimize_city`
  6. WHERE `QSOptimize_city`. `province_id` IN ( 1);
  7. SELECT `QSOptimize_person`. `id`, `QSOptimize_person`. `firstname`, `QSOptimize_person`. `lastname`,
  8. `QSOptimize_person`. `hometown_id`, `QSOptimize_person`. `living_id`
  9. FROM `QSOptimize_person`
  10. WHERE `QSOptimize_person`. `hometown_id` IN ( 1, 3);

... , 3 ? ?
>>> people = list(Person.objects.select_related("hometown__province").filter(hometown__province__name__iexact=u"   "))
    
    
    
    

    
    
    
    
  1. SELECT `QSOptimize_person`. `id`, `QSOptimize_person`. `firstname`, `QSOptimize_person`. `lastname`,
  2. `QSOptimize_person`. `hometown_id`, `QSOptimize_person`. `living_id`, `QSOptimize_city`. `id`,
  3. `QSOptimize_city`. `name`, `QSOptimize_city`. `province_id`, `QSOptimize_province`. `id`, `QSOptimize_province`. `name`
  4. FROM `QSOptimize_person`
  5. INNER JOIN `QSOptimize_city` ON ( `QSOptimize_person`. `hometown_id` = `QSOptimize_city`. `id`)
  6. INNER JOIN `QSOptimize_province` ON ( `QSOptimize_city`. `province_id` = `QSOptimize_province`. `id`)
  7. WHERE `QSOptimize_province`. `name` LIKE ' ';
+----+-----------+----------+-------------+-----------+----+--------+-------------+----+--------+
| id | firstname | lastname | hometown_id | living_id | id | name | province_id | id | name   | +----+-----------+----------+-------------+-----------+----+--------+-------------+----+--------+ |  1 |   |         | 3 |         1 | 3 |     | 1 |  1 |     |
| 2 |          |   |           1 | 3 |  1 |     |           1 | 1 |     | |  3 |   |        | 3 |         2 | 3 |     | 1 |  1 |     |
+----+-----------+----------+-------------+-----------+----+--------+-------------+----+--------+
3 rows in set (0.00 sec)
。 SQL ,python 。

select_related() prefetch_related()。 , select_related() , , ForeignKey , prefetch_related()。



QuerySet, 。
model:Order ( )

    
    
    
    
  1. class Order(models.Model):
  2. customer = models.ForeignKey(Person)
  3. orderinfo = models.CharField(max_length= 50)
  4. time = models.DateTimeField(auto_now_add = True)
  5. def __unicode__(self):
  6. return self.orderinfo
id 。 ManyToManyField prefetch_related()。 prefetch_related() ?

    
    
    
    
  1. >>> plist = Order.objects.prefetch_related( 'customer__visitation__province').get(id= 1)
  2. >>> for city in plist.customer.visitation.all():
  3. ... print city.province.name
  4. ...
, 4 :Order、Person、City、Province, prefetch_related() 4 SQL

    
    
    
    
  1. SELECT `QSOptimize_order`. `id`, `QSOptimize_order`. `customer_id`, `QSOptimize_order`. `orderinfo`, `QSOptimize_order`. `time`
  2. FROM `QSOptimize_order`
  3. WHERE `QSOptimize_order`. `id` = 1 ;
  4. SELECT `QSOptimize_person`. `id`, `QSOptimize_person`. `firstname`, `QSOptimize_person`. `lastname`, `QSOptimize_person`. `hometown_id`, `QSOptimize_person`. `living_id`
  5. FROM `QSOptimize_person`
  6. WHERE `QSOptimize_person`. `id` IN ( 1);
  7. SELECT ( `QSOptimize_person_visitation`. `person_id`) AS `_prefetch_related_val`, `QSOptimize_city`. `id`,
  8. `QSOptimize_city`. `name`, `QSOptimize_city`. `province_id`
  9. FROM `QSOptimize_city`
  10. INNER JOIN `QSOptimize_person_visitation` ON ( `QSOptimize_city`. `id` = `QSOptimize_person_visitation`. `city_id`)
  11. WHERE `QSOptimize_person_visitation`. `person_id` IN ( 1);
  12. SELECT `QSOptimize_province`. `id`, `QSOptimize_province`. `name`
  13. FROM `QSOptimize_province`
  14. WHERE `QSOptimize_province`. `id` IN ( 1, 2);
+----+-------------+---------------+---------------------+
| id | customer_id | orderinfo | time                | +----+-------------+---------------+---------------------+ |  1 | 1 | Info of Order | 2014-08-10 17:05:48 |
+----+-------------+---------------+---------------------+
1 row in set (0.00 sec)

±—±----------±---------±------------±----------+
| id | firstname | lastname | hometown_id | living_id |
±—±----------±---------±------------±----------+
| 1 | | | 3 | 1 |
±—±----------±---------±------------±----------+
1 row in set (0.00 sec)

±----------------------±—±-------±------------+
| _prefetch_related_val | id | name | province_id |
±----------------------±—±-------±------------+
|
1 | 1 | | 1 |
| 1 | 2 | | 2 |
|
1 | 3 | | 1 |
±----------------------±—±-------±------------+
3 rows in set (0.00 sec)

±—±-------+
| id | name |
±—±-------+
|
1 | |
| 2 | |
±—±-------+
2 rows in set (0.00 sec)



select_related() prefetch_related(), select_related()

   
   
   
   
  1. >>> plist = Order.objects.select_related( 'customer').prefetch_related( 'customer__visitation__province').get(id= 1)
  2. >>> for city in plist.customer.visitation.all():
  3. ... print city.province.name
  4. ...
3 SQL ,Django select_related, prefetch_related , 1 SQL :

    
    
    
    
  1. SELECT `QSOptimize_order`. `id`, `QSOptimize_order`. `customer_id`, `QSOptimize_order`. `orderinfo`
  2. `QSOptimize_order`. `time`, `QSOptimize_person`. `id`, `QSOptimize_person`. `firstname`
  3. `QSOptimize_person`. `lastname`, `QSOptimize_person`. `hometown_id`, `QSOptimize_person`. `living_id` 
  4. FROM `QSOptimize_order` 
  5. INNER JOIN `QSOptimize_person` ON ( `QSOptimize_order`. `customer_id` = `QSOptimize_person`. `id`
  6. WHERE `QSOptimize_order`. `id` = 1 ;
  7. SELECT ( `QSOptimize_person_visitation`. `person_id`) AS `_prefetch_related_val`, `QSOptimize_city`. `id`
  8. `QSOptimize_city`. `name`, `QSOptimize_city`. `province_id` 
  9. FROM `QSOptimize_city` 
  10. INNER JOIN `QSOptimize_person_visitation` ON ( `QSOptimize_city`. `id` = `QSOptimize_person_visitation`. `city_id`
  11. WHERE `QSOptimize_person_visitation`. `person_id` IN ( 1);
  12. SELECT `QSOptimize_province`. `id`, `QSOptimize_province`. `name` 
  13. FROM `QSOptimize_province` 
  14. WHERE `QSOptimize_province`. `id` IN ( 1, 2);
+----+-------------+---------------+---------------------+----+-----------+----------+-------------+-----------+
| id | customer_id | orderinfo | time                | id | firstname | lastname | hometown_id | living_id |
+----+-------------+---------------+---------------------+----+-----------+----------+-------------+-----------+
| 1 |           1 | Info of Order | 2014-08-10 17:05:48 | 1 |          |   |           3 | 1 |
+----+-------------+---------------+---------------------+----+-----------+----------+-------------+-----------+
1 row in set (0.00 sec)

±----------------------±—±-------±------------+
| _prefetch_related_val | id | name   | province_id |
±----------------------±—±-------±------------+
|
                    1 |  1 | |           1 |
|                     1 |  2 | |           2 |
|
                    1 |  3 | |           1 |
±----------------------±—±-------±------------+
3 rows in set (0.00 sec)

±—±-------+
| id | name |
±—±-------+
|
1 | |
| 2 | |
±—±-------+
2 rows in set (0.00 sec)


, prefetch_related select_related, Django : select_related, prefetch_related。 prefetch_related ,select_related 。


  1. select_related() SQL , prefetch_related() SQL , select_related() 。
  2. , select_related() 。 select_related() prefetch_related()。
  3. QuerySet select_related() prefetch_related(), SQL 。
  4. prefetch_related() select_related() , 。



, 。 , , 。 , 。

좋은 웹페이지 즐겨찾기