2

私が次のものを持っているとしましょう:

class Model1(Model):

    field1 = ForeignKey(Model2)
    query_field = IntegerField()

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

class Model3(Model)
    field3 = SomeDesiredValue

ここで、テーブルに対してクエリを実行し、からModel1引き出したいと考えています。私の質問は のパフォーマンスについてです。field3Model3select_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')
4

2 に答える 2

3

はい、最初のクエリは 2 つのデータベース ヒットにつながり、2 番目のクエリは 2 つの INNER JOINS を持つ 1 つの 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
于 2015-02-06T09:22:40.220 に答える