gpt4 book ai didi

python - 如果我们已经有了相关对象的实例,如何优化相关对象的延迟加载?

转载 作者:行者123 更新时间:2023-12-01 00:45:49 26 4
gpt4 key购买 nike

我喜欢 Django ORM 在查询集中延迟加载相关对象的方式,但我想它是相当不可预测的。当使用相关对象创建查询集时,查询集 API 不会保留相关对象,从而在以后访问时再次获取它们。

假设我有一个 ModelA 实例(例如 instance_a),它是 N 个实例的外键(例如 for_a) >模型B。现在我想对 ModelB 执行查询,该查询将给定的 ModelA 实例作为外键。

Django ORM提供了两种方式:

  • ModelB 上使用 .filter():
b_qs = ModelB.objects.filter(for_a=instance_a)
for instance_b in b_qs:
instance_b.for_a # <-- fetches the same row for ModelA again

此处产生 1 + N 次查询。

  • ModelA 实例上使用反向关系:
b_qs = instance_a.for_a_set.all()
for instance_b in b_qs:
instance_b.for_a # <-- this uses the instance_a from memory

仅在此处产生 1 个查询。

虽然可以使用第二种方法来实现结果,但它不是标准 API 的一部分,并且不适用于所有场景。例如,如果我有 ModelB 的 2 个外键实例(例如 ModelAModelC),并且我想获取这两个外键的相关对象其中。类似于以下内容的作品:

ModelB.objects.filter(for_a=instance_a, for_c=instance_c)

我想在这种情况下可以使用 .intersection() ,但我想要一种通过标准 API 实现此目的的方法。毕竟,覆盖此类情况将需要更多带有非标准查询集函数的代码,这对于下一个开发人员来说可能没有意义。

那么,第一个问题,是否可以使用标准 API 本身来优化此类场景?第二个问题,如果现在不可能,是否可以通过 QuerySet 进行一些调整来添加它?

PS:这是我第一次在这里提问,如果有什么错误请原谅。

最佳答案

您可以使用select_related()来改进查询:

b_qs = ModelB.objects.select_related('for_a').filter(for_a=instance_a)

b_qs = instance_a.for_a_set.select_related('for_a')

这有帮助吗?

关于python - 如果我们已经有了相关对象的实例,如何优化相关对象的延迟加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56997367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com