我知道您可以预取单个过滤查询集,例如.

Parent.objects.all()
.prefetch_related(
  Prefetch("child_set", queryset=Child.objects.filter(type="A")
)

这样,运行obj.child_set.all().count()将返回相关A Child中的count,而无需运行另一个查询.

但是如果我也想数到B呢?因此,下面将需要2个查询-我可以以某种方式预取它们吗?

return {
  "a_count": obj.log_set.filter(type="A").all().count(),
  "b_count": obj.log_set.filter(type="B").all().count(),
}

Edit:

Parent.objects.all()
.prefetch_related(
  Prefetch("child_set", queryset=Child.objects.filter(type="A"),
  Prefetch("child_set", queryset=Child.objects.filter(type="B")
)

但当我try 访问该对象时,会出现以下错误:

{
    "detail": "Not found."
}

推荐答案

关于您的主要问题,您可以在同一字段上使用Prefetch..[Django-doc]个对象和不同的过滤器,但可以使用不同的to_attr值来分配它们,如下所示:

from django.db.models import Prefetch


Parent.objects.prefetch_related(
    Prefetch(
        "child_set", 
        queryset=Child.objects.filter(type="A"), 
        to_attr="child_set_a"
    ),
    Prefetch(
        "child_set", 
        queryset=Child.objects.filter(type="B"), 
        to_attr="child_set_b"
    ),
)

Django相关问答推荐

我的Django终结点不访问HAS_OBJECT_PERMISSION方法

社工/社工简戈

更改Django的创建时间字段

来自日历的 Django 动态 url

断开连接不会发生

Django 如何知道我的数据库的路径?

Django中的多对多关系?

Django 嵌套事务 - with transaction.atomic()

Django error:不能分配必须是实例

Django 管理命令参数

为用户添加自定义权限

Django 模板和变量属性

Django中的自定义排序

在 Django 开发服务器中关闭静态文件的缓存

'function' 对象没有属性 'as_view'

Django 在视图之间传递数据

如何在 django 2.0 admin 中使用 allow_tags?

Django中GROUP BY中注释的聚合

AttributeError:ManyRelatedManager对象没有add属性?

django/文件上传权限