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

标签 django django-models

假设以下模型

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/

相关文章:

Django HttpResponseRedirect 将变量传递给模板并读取它

python - 限制 django 应用程序模型中的单个记录?

python - Django 2.2 静态/媒体文件不显示/处理

mysql - 什么是 SELECT col1 FROM table WHERE col2=somestring 的 Django ORM 等价物?

python - 更改模型以从抽象基类继承而不更改数据库

python - 帮助构建一对多关系的 GQL 查询

python - Django有序序列模型设计

python - Django 时区字段不接受所有 pytz 时区

python - 模拟 - 测试是否在不指定参数的情况下调用方法

python - 在 Django Rest Framework 中修改序列化程序的输出