使用 select_related 获取两个模型之外的值
Using select_related to get values two models away
假设我有以下内容:
class Model1(Model):
field1 = ForeignKey(Model2)
query_field = IntegerField()
class Model2(Model):
field2 = ForeignKey(Model3)
class Model3(Model)
field3 = SomeDesiredValue
现在我想查询 Model1
table 并从 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')
是的,第一个查询导致两次数据库命中,第二个查询将使用一个 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()
这将从 Model2 获取所有 field2(这意味着所有与 Model2 相关的 Model3)
如果您需要任何帮助,请直接询问 :)
假设我有以下内容:
class Model1(Model):
field1 = ForeignKey(Model2)
query_field = IntegerField()
class Model2(Model):
field2 = ForeignKey(Model3)
class Model3(Model)
field3 = SomeDesiredValue
现在我想查询 Model1
table 并从 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')
是的,第一个查询导致两次数据库命中,第二个查询将使用一个 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()
这将从 Model2 获取所有 field2(这意味着所有与 Model2 相关的 Model3) 如果您需要任何帮助,请直接询问 :)