Django 子查询和带有 OuterRef 的注释

2023-12-24

我在使用 annotate() 时遇到问题OuterRef在 Django 1.11 中的子查询。型号示例:

class A(models.Model):
    name = models.CharField(max_length=50)


class B(models.Model):
    a = models.ForeignKey(A)

现在是带有子查询的查询(这实际上没有任何意义,但说明了我的问题):

A.objects.all().annotate(
    s=Subquery(
        B.objects.all().annotate(
            n=OuterRef('name')
        ).values('n')[:1],
        output_field=CharField()
    )
)

这会产生以下错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "myapp/models.py", line 25, in a
    n=OuterRef('name')
  File ".virtualenv/lib/python2.7/site-packages/django/db/models/query.py", line 948, in annotate
    if alias in annotations and annotation.contains_aggregate:
AttributeError: 'ResolvedOuterRef' object has no attribute 'contains_aggregate'

是否无法基于 OuterRef 注释子查询?


更新#1

找到了一个解决方法,可以让我暂时继续前进,但这并不好。

class RawCol(Expression):

    def __init__(self, model, field_name, output_field=None):
        field = model._meta.get_field(field_name)
        self.table = model._meta.db_table
        self.column = field.column
        super().__init__(output_field=output_field)

    def as_sql(self, compiler, connection):
        sql = f'"{self.table}"."{self.column}"'
        return sql, []

改变OuterRef使用自定义表达式

A.objects.all().annotate(
    s=Subquery(
        B.objects.all().annotate(
            n=RawCol(A, 'name')
        ).values('n')[:1],
        output_field=CharField()
    )
)

Yields

SELECT "myapp_a"."id",
       "myapp_a"."name",

  (SELECT "myapp_a"."name" AS "n"
   FROM "myapp_b" U0 LIMIT 1) AS "s"
FROM "myapp_a"

这是 Django 中的一个已知错误,已在 3.0 中修复。

See https://code.djangoproject.com/ticket/28621 https://code.djangoproject.com/ticket/28621供讨论。

如果您像我一样需要注释该字段以便可以在以下子查询中使用它,请记住您可以堆叠OuterRef like:


id__in=SubQuery(
    MyModel.objects.filter(
        field=OuterRef(OuterRef(some_outer_field))
    )
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 子查询和带有 OuterRef 的注释 的相关文章

随机推荐

  • 如何为没有区域设置属性的 NSFormatter 指定区域设置/语言?

    NSFormatter 有很多专门的子类 CNContactFormatter CNPostalAddressFormatter DRMSFFormatter MKDistanceFormatter NSByteCountFormatter
  • 压缩文件保留目录结构

    我正在使用 codeplex 中的 DotNetZip DLL http dotnetzip codeplex com 来压缩程序中的一些文件 我面临的问题是在压缩文件后 它保留了目录结构 当我提取 zip 文件时 所有父文件夹都会再次创建
  • Onclick CSS 按钮效果

    我正在创建一个 CSS 按钮 并尝试制作一个 onclick 效果 当用户单击该按钮时 它会将按钮文本下推 1px 我的问题是它按下了按钮的整个底部 你将如何进行 div class one p a href Button a p div
  • 从主要活动中禁用片段中的按钮

    我的片段中有 3 个按钮 我想从主要活动中禁用它们 我尝试在replace newfragment之前使用bundle选项 但它产生了其他问题 片段中的按钮可以投射到主要活动吗 像这样的东西 我收到错误无法投射 但我的输入不正确 RedUp
  • Babel 7 中的外部导入不会被转译

    我目前正在将代码库从 Babel 6 迁移到 7 该代码由多个具有自己配置的单独项目组成 The main项目从以下位置导入文件external然而脚本是从导入的external by main没有被转译并且在 意外的令牌导入 上失败 脚本
  • Angular ui 选项卡,每个选项卡都有单独的控制器

    我想制作一个引导选项卡集 每个选项卡都有自己的控制器 谁能指出我应该朝哪个方向走 目前我已经制作了几个不同的控制器 我希望在选项卡集中使用它们 而不是将它们显示为不同的路线 我知道我可以通过在不同的控制器模板中将选项卡集显示为活动的给定控制
  • 如何找到最佳的模糊字符串匹配?

    蟒蛇的新的正则表达式模块 https pypi python org pypi regex支持模糊字符串匹配 大声歌颂 现在 根据文档 The ENHANCEMATCH标志进行模糊匹配尝试以提高拟合度 它找到的下一个匹配项 The BEST
  • 获取用户输入的数字列表

    我尝试使用input Py3 raw input Py2 获取数字列表 但是使用代码 numbers input print len numbers 输入 1 2 3 and 1 2 3给出的结果是7 and 5分别 它似乎将输入解释为字符
  • 在Lua中,我可以轻松地选择第N个结果而不需要自定义函数吗?

    假设我将一个字符串插入到表中 如下所示 table insert tbl mystring 然后mystring通过将所有出现的 a 替换为 b 生成input mystring string gsub input a b 将两者合并为一个
  • 使用 JSON.NET 序列化/反序列化动态属性名称

    我有以下课程 public class MyRequest public string Type get set public string Source get set 我想序列化 反序列化以下值Source来自名为值的 JSON 字段T
  • java使用excel打开csv文件

    我正在为大学做一个项目 并制作了一个创建 csv 文件的程序 我希望有一个按钮 您可以单击该按钮 然后使用 Excel 打开 csv 文件 谢谢 知道系统上安装了 MsOffice 您应该能够使用以下命令从命令行打开文档 excel myD
  • Keycloak.loadUserProfile() 上的 Keycloak 403(禁止)

    我是 Keycloak 的新手 我尝试使用以下代码获取用户信息 keycloakAuth loadUserProfile success function profile debugger console log profile error
  • InvalidOperationException:无法为“角色”创建 DbSet,因为该类型未包含在上下文的模型中

    以下解决方案在 net core 1 1中有效 但从1 1升级到2 0后 我收到以下错误 InvalidOperationException 无法为 Role 创建 DbSet 因为该类型未包含在上下文的模型中 当用户尝试登录时 执行以下语
  • 捕获谷歌应用程序引擎日志输出

    如何在管理控制台之外查看 Google App Engine 日志 我正在开发 所以使用dev appserver py 管理控制台并希望在发出记录时查看日志 我想使用标准 Unix 工具 例如 在控制台中监控日志输出 less grep
  • 查找文件中最后一次出现的字符串

    我需要从 C 中的特定字符串中获取最后一次出现的日志跟踪 例如 lines File ReadLines logPath SkipWhile line gt line Contains param Take 20 该代码可以工作 但它从日志
  • Coffeescript 中的臃肿 JS 想要返回所有内容

    我这里有这个 Coffeescript brew args gt for e in args alert e null brew fo re eo 我希望我不需要在那里放置 null 来让它工作 但可惜的是 它编译成这样 brew func
  • 比较 Pyspark 中的列

    我正在开发一个包含 n 列的 PySpark DataFrame 我有一组 m 列 m 例如 输入 PySpark DataFrame 包含 col 1 1 2 3 col 2 2 1 4 col 3 3 2 5 Ouput col 4 m
  • 如何将 git note 移动到不同的提交?

    我已经错误地记录了错误的提交 有没有一种简单的方法可以将其整体移动到不同的提交 我希望有一种方法可以在语义上将注释重新定位到不同的提交上 但是无论什么是最简单的都会很高兴知道 我怀疑最简单的选择是使用桌面剪贴板复制粘贴文本 可能最简单的方法
  • 等宽窗扇

    我的应用程序有一个带有两个孩子的 SashForm 我希望在调整窗口大小时左孩子保持相同的大小 我想要 Eclipse 对 Package Explorer 和主编辑器做同样的事情 当您调整窗口大小时 只有文本编辑器会更改大小 但是 Pac
  • Django 子查询和带有 OuterRef 的注释

    我在使用 annotate 时遇到问题OuterRef在 Django 1 11 中的子查询 型号示例 class A models Model name models CharField max length 50 class B mod