Django-从子查询注释多个字段

伊曼纽尔·科泽尔斯基(Emanuel Kozerski)

我正在处理一个Django项目,在该项目上我具有一个“ A”对象(A.objects.all())的查询集,并且需要注释来自“ B”对象“子查询的多个字段。问题在于,注释方法只能针对每个参数处理一种字段类型(DecimalField,CharField等),因此,要注释多个字段,我必须使用类似以下内容的方法:

A.objects.all().annotate(b_id          =Subquery(B_queryset.values('id')[:1],
                         b_name        =Subquery(B_queryset.values('name')[:1],
                         b_other_field =Subquery(B_queryset.values('other_field')[:1],
                         ... )

这是非常低效的,因为它会在最终SQL上为我要注释的每个字段创建一个新的子查询/子选择。我想在其values()参数的多个字段上使用相同的Subselect,并在A的queryset上全部注释它们。我想使用这样的东西:

b_subquery = Subquery(B_queryset.values('id', 'name', 'other_field', ...)[:1])
A.objects.all().annotate(b=b_subquery)

但是,当我尝试执行此操作(并访问第一个元素A.objects.all().annotate(b=b_subquery)[0])时,将引发异常:

{FieldError}Expression contains mixed types. You must set output_field.

如果我设置了Subquery(B_quer...[:1], output_field=ForeignKey(B, models.DO_NOTHING)),我得到一个数据库异常:

{ProgrammingError}subquery must return only one column

简而言之,整个问题是我有多个“属于”一个A的B,所以我需要A.objects.all()使用Subquery对每个A中的一个选择一个特定的B并将其附加到该A上,并使用OuterRefs和一些过滤器(我只想要B的几个字段),这对我来说是一个微不足道的问题。

感谢您的任何帮助!

托多尔

在这种情况下,我要做的是使用与预取相关的

a_qs = A.objects.all().prefetch_related(
    models.Prefetch('b_set',
        # NOTE: no need to filter with OuterRef (it wont work anyway)
        # Django automatically filter and matches B objects to A
        queryset=B_queryset,
        to_attr='b_records'
    )
)

现在a.b_records将是一个包含a's相关b对象的列表根据您过滤的方式,B_queryset此列表可能仅限于1个对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用多个字段对带有计数的Django查询集进行注释

来自分类Dev

Django在与同一模型相关的多个字段上注释

来自分类Dev

如何在 Django 中过滤具有多个字段对象的查询集?

来自分类Dev

Django从子查询父

来自分类Dev

从Django模型返回多个字段

来自分类Dev

django计算多个字段的不同值

来自分类Dev

从单个字段过滤多个值-Django

来自分类Dev

Django-查询:使用相关模型字段注释查询集

来自分类Dev

使用django-filter对多个字段进行查询,每个查询都有一个自定义方法

来自分类Dev

Django在具有多个值的多个字段中搜索

来自分类Dev

注释django字段

来自分类Dev

Django查询集优化-防止选择带注释的字段

来自分类Dev

django 查询集注释子表中的所有字段

来自分类Dev

Django 在查询集中添加一个字段

来自分类Dev

Django脆皮表单-为多个字段设置标签文本

来自分类Dev

django.db跨多个字段的聚合

来自分类Dev

Django从数据库获取多个字段

来自分类Dev

如何在Django模型中搜索多个字段

来自分类Dev

使用for循环保存模型实例的多个字段-Django

来自分类Dev

Django计算多个对象中2个字段的均值

来自分类Dev

高效地更新Django中的多个字段

来自分类Dev

Django bulk_create检查多个字段的重复条目

来自分类Dev

Django Count()多个字段并按其总和排序

来自分类Dev

Django:URL模式以包含来自多个字段的值

来自分类Dev

Django从数据库获取多个字段

来自分类Dev

Django脆皮表单-为多个字段设置标签文本

来自分类Dev

Django 一个字段中的多个文件

来自分类Dev

Django 模型:为一个字段组合多个字段条目

来自分类Dev

Django QuerySets-如何注释一个字段但返回另一个字段?

Related 相关文章

热门标签

归档