2015-02-06 53 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) 如果您需要任何帮助,只是问:)