2015-02-06 7 views
2

는 다음과 내가 가지고 말할 수 있습니다 사용 :는 값이 두 모델을 얻을 수 select_related 멀리

class Model1(Model): 

    field1 = ForeignKey(Model2) 
    query_field = IntegerField() 

class Model2(Model): 
    field2 = ForeignKey(Model3) 

class Model3(Model) 
    field3 = SomeDesiredValue 

지금 나는 Model1 테이블에 쿼리를하고 Model3에서 field3를 꺼내 싶다. 제 질문은 select_related의 성과입니다.

나는 다음과 있으리라 믿고있어

query = Model1.objects.filter(query_field=filter_paramter).select_related('field1') 

여전히 데이터베이스에 접속합니다한다면?

query[0].field1.field2.field3 

더 빨리 진행하려면 어떻게해야합니까?

query = Model1.objects.filter(query_field=filter_paramter).select_related('field1__field2') 
+0

FWIW을 물어, 당신은 말에 의해 실행됩니다 실제 SQL 쿼리를 볼 수 있습니다 'print query.query' (예제의 변수 사용) - [here] (http://stackoverflow.com/q/971667/2428558)와 관련된 질문입니다. – Jackall

답변

3

네, 첫 번째 쿼리는 두 개의 데이터베이스 안타로 연결하고, 두 번째 쿼리는 두 INNER 하나의 SQL 쿼리로 처리됩니다 조인이 같은

SELECT "app_model1"."id", "app_model1"."field1_id", 
     "app_model1"."query_field", "app_model2"."id", 
     "app_model2"."field2_id", "app_model3"."id", 
     "app_model3"."field3" 
FROM "app_model1" 
INNER JOIN "app_model2" ON ("app_model1"."field1_id" = "app_model2"."id") 
INNER JOIN "app_model3" ON ("app_model2"."field2_id" = "app_model3"."id") 
WHERE "app_model1"."query_field" = 1 LIMIT 1 
+0

답변 해 주셔서 감사합니다. 빠른 설명,'.select_related ('field1__field2') '를 사용하면'Model2'에서 모든 것을 가져 옵니까? 아니면'Model3' 테이블과 조인을해야합니까? – sedavidw

+1

'Model2'와'Model3' 모델 모두를위한 모든 것을로드합니다. 따라서'obj = query.first() \ n obj.field1.some_attr \ n obj.field1.other_attr \ n obj.field1.field2.field3' - 모든 것은 단일 SQL 쿼리로 처리됩니다. – catavaran

+0

굉장, 고마워. – sedavidw

1
class Model1(Model): 

    field1 = ForeignKey(Model2, related_name="model2") 
    query_field = IntegerField() 

class Model2(Model): 
    field2 = ForeignKey(Model3, related_name="model3") 

class Model3(Model) 
    field3 = SomeDesiredValue 

과 무언가 것 나아지 다.

mdls1 = Model1.objects.filter(query_field=filter_paramter).first() 

related_model3s = mdls1.field1.model3.all() 

이 모델 2에서 모든 FIELD2를 얻을 것이다 (이 모델 2와 관련된 모든 Model3 의미) 당신이 어떤 도움이 필요하면 그냥 :)