2015-02-06 58 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查詢'打印query.query'(在你的例子中使用變量) - [這裏](http://stackoverflow.com/q/971667/2428558)是一個相關的問題。 – Jackall 2015-02-06 10:13:51

回答

3

是,第一個查詢引出兩個數據庫訪問和第二次查詢將與一個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 2015-02-06 12:37:28

+1

它加載'Model2'和'Model3'模型的所有內容。因此,'obj = query.first()\ n obj.field1.some_attr \ n obj.field1.field2.other_attr \ n obj.field1.field2.field3' - 所有將使用單個SQL查詢處理。 – catavaran 2015-02-06 13:32:19

+0

太棒了,謝謝 – sedavidw 2015-02-06 14:15:58

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的所有域2(這意味着Model2的所有相關Model3) 如果您需要任何幫助,只是問:)