gpt4 book ai didi

django - 使用 prefetch_related 仅获取关系的特定条目

转载 作者:行者123 更新时间:2023-12-04 00:43:24 29 4
gpt4 key购买 nike

假设以下模型

Class A(): pass
Class B():
i = integer()
aa = foreignkey('A', related_name = 'fka')

为简单起见,假设以下条目,

A() - a1 -> pk = 1
B() - b1 -> i = 1, aa = a1
B() - b2 -> i = 2, aa = a1
B() - b3 -> i = 3, aa = a1
B() - b4 -> i = 4, aa = a1
B() - b5 -> i = 5, aa = a1

我知道,

foo = A.objects.get(pk = 1).prefetch_related('fka')

会给我条目 b1、b2、b3、b4 和 b5。

但我想知道的是,是否有可能以任何方式更改此查询以仅获取与 A() 关联的 B() 的特定条目。假设我只想预取“B”的条目,“i”为 2(获取 b2,并跳过 b1、b3、b4 和 b5)。

如果使用预取无法做到这一点,那么最好的方法是什么?

注意:get(pk = 1)用于保持解释的简单性,但在那个地方通常会有filter(**conditions)

最佳答案

是否需要对 A 对象而不是 B 对象进行查询?如果你反转你做额外查找的内容,你可以使用 select_related():

foo = B.objects.select_related('aa').get(i=2)

这具有减少数据库命中次数的优势。因为 prefetch_related() 总是进行自己的数据库查找,所以您提出的使用 prefetch_related() 的方案并不比简单地执行更有效:

a = A.objects.get(pk=1)
b = a.fka.get(i=2)

这并不是说它在过滤更复杂的场景中不会更有效,而是 select_related() 使用 SQL 连接,因此只访问数据库一次。也就是说,如果您绝对必须首先查找 A 对象,最好的答案是:升级到 Django 1.7。 Django 1.7 中的新 Prefetch 命令允许对 prefetch_related() 进行更复杂的操作,包括过滤,允许您指定自定义查询集:

qs = B.objects.filter(i=2)
foo = A.objects.get(pk = 1).prefetch_related(Prefetch('fka',qs))

关于django - 使用 prefetch_related 仅获取关系的特定条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25755249/

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