Использование select_related для получения значений двух моделей
Допустим, у меня есть следующее:
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')
2 ответа
Решение
Да, первый запрос приводит к двум попаданиям в базу данных, а второй запрос будет обработан одним SQL-запросом с двумя INNER JOINS:
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
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()
это получит все field2 от Model2(это означает все связанные Model3 с Model2) Если вам нужна помощь, просто спросите:)