假设我有以下几点:

class Model1(Model):

    field1 = ForeignKey(Model2)
    query_field = IntegerField()

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

class Model3(Model)
    field3 = SomeDesiredValue

现在我想查询Model1表并从field3中拉出Model3。我的问题是关于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')

最佳答案

是的,第一个查询将导致两次数据库命中,第二个查询将使用一个带有两个内部连接的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

10-08 20:16