与 .annotate() 结合使用时,Django 查询集联合似乎不起作用

2024-03-09

我有以下查询集:

photos = Photo.objects.all()

我过滤掉两个查询:

a = photos.filter(gallery__name='NGL')
b = photos.filter(gallery__name='NGA')

我将它们加在一起,它们形成一个新的、更大的查询集:

c = a | b

确实,长度a + b equals c:

a.count() + b.count() == c.count()
>>> True

到目前为止,一切都很好。然而,如果我介绍一个.annotate(), the |似乎不再起作用:

a = photos.annotate(c=Count('label').exclude(c__lte=4)
b = photos.filter(painting=True)
c = a | b
a.count() + b.count() == c.count()
>>> False

我如何组合查询集,即使.annotate()正在被使用?请注意,查询一和查询二都可以单独按预期工作,只有在使用组合它们时|是不是好像出了问题。


管道|或与号&结合实际的查询集OR or AND到 SQL 查询,所以它看起来像是组合在一起的。

one = Photo.objects.filter(id=1)
two = Photo.objects.filter(id=2)
combined = one | two

print(combined.query)
>>> ... WHERE ("photo_photo"."id" = 1 OR "photo_photo"."id" = 2)...

但是,当您组合更多过滤器并排除时,您可能会注意到它会给您带来奇怪的结果。这就是为什么当您比较计数时它不匹配的原因。

如果你使用.union()您必须具有具有相同数据类型的相同列,因此您必须注释两个查询集。关于信息.union()

  • .UNION() 中的 SELECT 语句必须具有相同的列数
  • 这些列还必须具有相似的数据类型
  • 每个 SELECT 语句中的列也必须具有相同的顺序

你必须记住,蟒蛇的论点kwargs对于不定数量的参数是字典,因此如果要使用带有多个注释的注释,则无法确保列的正确顺序。幸运的是,您可以通过链接注释命令来解决这个问题。

 # printed query of this won't be consistent
 photo_queryset.annotate(label_count=Count('labels'), tag_count=Count('tags')) 
 # this will always have same order of columns
 photo_queryset.annotate(label_count=Count('labels')).annotate(tag_count=Count('tags'))

然后你可以使用.union()并且它不会弄乱注释的结果。还.union()应该是最后一个方法,因为之后.union()你不能使用filter类似的方法。如果你想保留重复项,你可以使用.union(qs, all=True) since .union()有默认值all=False并打电话DISTINCT在查询集上

photos = Photo.objects.annotate(c=Count('labels'))
one = photos.exclude(c__lte=4)
two = photos.filter(painting=True)
all = one.union(two, all=True)
one.count() + two.count() == all.count()
>>> True

那么它应该像你所描述的那样工作

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

与 .annotate() 结合使用时,Django 查询集联合似乎不起作用 的相关文章

  • 如何根据当前请求更改 django 设置?

    我从一个 django 实例运行多个站点 并期望该框架最终能够通过一个或多个安装为数百个站点提供服务 我需要根据当前请求修补一些 django 设置 我已经编写了一些中间件来对设置进行猴子修补 但我需要在调用中间件之前修补这些设置 因为其他
  • 如何在 Django 中创建多选框?

    我正在尝试创建多选框字段来自姜戈选择 2 https github com applegrew django select2库如下图所示 我使用了下一个代码 但它返回简单的选择多个小部件 我想我忘了补充一些东西 我的错误在哪里 有人可以告诉
  • 如何在 Django 中获取 URL(带有协议和域)(无需请求)?

    我想在 cron 作业中发送邮件 邮件应包含 我的应用程序的链接 在 cron 作业中 我没有请求对象 并且无法使用 request build absolute uri 据我所知 网站框架可以在这里提供帮助 但没有给我协议 http vs
  • Django:djcelery 从 celery import current_app as celery in virtualenv 导入错误

    好吧 我已经尝试了我和谷歌能想到的一切 我正在尝试在 Macbook Pro OSX 10 8 4 上的 virtualenv 下运行 django celery 我在激活 virtualenv 时使用 pip 安装了 django cel
  • 错误:从上游读取响应标头时上游过早关闭连接 [uWSGI/Django/NGINX]

    我目前在用户正在进行的查询中总是得到 502 它通常返回 872 行 在 MySQL 中运行需要 2 07 然而 它返回了大量信息 每一行包含很多东西 有任何想法吗 运行 Django tastypie Rest API Nginx 和 u
  • django获取FileField的绝对路径

    我试图在模板上调用 FileField 时检索绝对路径 以 http 开头 我怎样才能做到这一点 ie fl uploadedfile gt 返回相对路径 如 media uploads 当我想要的时候This http www blabl
  • 分布式设置中的 Django SECRET_KEY

    如果我在负载均衡器后面设置多个 django 服务器 我希望 SECRET KEY 相同 不同还是有关系 该文档对于这个值的具体用途有点薄弱 我想一定是一样的 这是相关问题 Django SECRET KEY https stackover
  • 在 Django 查询中与父级一起获取子级数据

    我有两个模型产品和产品包 产品包有一个产品型号的外键 我如何访问包含产品包的所有产品的列表 class Product models Model title models CharField verbose name Product Tit
  • Django - 使用 get_FOO_display 进行聚合

    考虑以下 status queryset values status annotate count Count status where status字段是一个CharField with choices 这将产生一个字典列表statusD
  • 如何从序列化器字段订购 Django Rest Framework 查询集?

    我如何订购 DjangoQuerySet来自序列化器字段 由于字段太复杂 我无法订购QuerySet using annotate我也无法将值存储在模型中 Edit 串行器 class DrinkListModelSerializer se
  • 有皮茨时区列表吗?

    我想知道 Python 库 pytz 中时区参数的所有可能值是什么 怎么做 您可以列出所有可用的时区pytz all timezones In 40 import pytz In 41 pytz all timezones Out 42 A
  • “psycopg2 的构建轮子失败” - 使用 virtualenv 和 pip 的 MacOSX

    我第一次尝试与其他几个人一起制作一个网站 在尝试使用 Django Python VirtualEnv 时遇到了一个奇怪的错误 我已经找到了针对其他操作系统 例如 Ubuntu 的此问题的解决方案 但找不到针对 Mac 的任何好的解决方案
  • 嵌套重组 - Django

    我有一个包含以下字段的模型 日期 员工 和 计划时间 每个员工对于不同的日期都有不同的计划工作时间 我正在尝试构建我的模板 其中员工按行列出 他们的计划工作时间列在正确的相应日期下的列中 像这样的东西 https i stack imgur
  • 从 django 返回带有 BOM 的 UTF-8 编码的 csv

    我正在尝试输出一个用户可以用 Excel 打开的 CSV 文件 我已经用 UTF 8 编码了所有字符串 但是当我用 Excel 打开文件时 我看到了乱码 只有在将文件转换为带 BOM 的 UTF 8 在 Windows 上使用 notepa
  • Django:通过外键将两个表连接到第三个表?

    我有三个型号 class A Model class B Model id IntegerField a ForeignKey A class C Model id IntegerField a ForeignKey A 我想要得到 B i
  • django-celery 在开发中工作,在 wsgi 生产中失败:如何调试?

    我正在使用 django celery 任务队列 它在开发中运行良好 但在 wsgi 生产中根本不起作用 更令人沮丧的是 used在生产中工作 但我不知何故破坏了它 sudorabbitmqctlstatus 告诉我rabbitmq服务器正
  • Django:在表单中初始化小部件时获取当前网址

    当我初始化表单以在其中找到我想要检查的字符串时 我想获取当前的 url 根据这个字符串 我想更改放入单选小部件中的数据 我想根据 url 显示不同的 radioselect 选项 class FunctionForm forms Model
  • 在 django 中创建“历史”类型模型的最佳方法是什么?

    我想为我的 Django 应用程序创建一个类似于 Django 管理员的 最近操作 的功能 以便存储其他模型的历史信息 例如 假设我有两个模型 分别称为 Book 和 Author 我想要第三个模型来存储信息 例如由谁以及何时对模型中的给定
  • 静态文件配置不正确

    我已经在 Heroku 上部署了简单的博客应用程序 它运行在Django 1 8 4 我在静态文件方面遇到了一些问题 当打开我的应用程序时 我看到Application Error页面 所以我尝试调试它并发现当我提交到 Heroku 时它无
  • Django CreateView:在验证之前设置用户

    我有一个模型 根据对象是由用户还是系统创建 对其名称字段使用不同的验证 class Symbol models Model name models CharField name unique True max length 64 creat

随机推荐

  • 如何禁用 UIWebview 水平滚动?

    我尝试通过插入来禁用它 到我的 HTML 字符串中 以及上面的十几个变体 徒劳地希望我只是搞砸了标签语法 但似乎没有什么可以阻止 UIWebView 水平滚动 然而 有些应用程序可以做到这一点 例如 MobileRSS 并且可能由于它们没有
  • iOS上删除大文件文件夹的性能

    假设我的 iOS 应用程序的数据目录中有一个文件夹 其中包含数千个小文件 删除此文件夹 通过 NSFileManager removeItemAtPath 需要相当长的时间 但在 OS X 上 删除具有相同内容的文件夹非常快 它似乎只是从文
  • Java 项目的包结构?

    在 Java Web 应用程序中设置包结构的最佳实践是什么 您将如何设置您的 src 单元测试代码等 你可以关注maven的标准项目布局 http maven apache org guides introduction introduct
  • shell中实时去除回车

    对于上下文 我尝试创建一个 shell 脚本来简化 ffmpeg 的实时控制台输出 仅显示正在编码的当前帧 我的最终目标是在某种进度指示器中使用此信息进行批处理 对于那些不熟悉 ffmpeg 输出的人来说 它将编码的视频信息输出到 stdo
  • pandas 对布尔类型应用过滤器

    这些是我的 DataFrame 的类型 count int64 word object cat1 bool cat2 object cat3 bool dtype object 如何对 cat1 和 cat2 中的布尔值进行过滤 就像是 d
  • 如何在 C# 中使用可选参数?

    Note This question was asked at a time when C did not yet support optional parameters i e before C 4 我们正在构建一个从 C 类以编程方式生
  • 如何检索 git 中两次提交之间更改的 maven 模块列表

    我有一个带有主模块和多个子模块的 Maven 项目 我想知道是否有一种简单的方法来检索两次提交之间更改的所有模块 无论如何 在问题提出近三年后 我基于 git diff 的启发式设计 基于 Maven 工件受惯例支配的事实 提取所有文件更改
  • 从 CursorAdapter.get() 返回对象

    我正在重写 CursorAdapter 我需要获取最后一项 问题是 CursorAdapter 实际上有一个 get 方法 但源是一个数据库 它返回一个普通对象 我什至不知道它是什么 我希望它返回一个 Cursor 对象 尽管如此 我怎样才
  • Android studio logcat最大行数

    我正在使用连接到 Android Studio 的真实设备进行测试 由于我不想中断多线程行为 因此我在代码中添加了大量日志语句以了解发生了什么 在 logcat 中 我看到了即将到来的语句 到目前为止一切顺利 运行完整测试后 我发现我的日志
  • 我应该从 MVC 框架中的控制器或模型中调用 redirect() 吗?

    我正在使用 MVC PHP 框架 Codeigniter 并且我有一个直接的问题 即从哪里调用redirect 控制器还是模型 设想 用户导航到 www example com item 555 在我的模型中 我在项目数据库中搜索 ID 为
  • 如何在使用 Moq 的测试中引发事件?

    以下是父类中的部分代码实现 handler FooUpdateDelegate FooUpdate OnFooUpdate protected abstract void OnFooUpdate ref IBoo boo string s
  • 如何在解决方案级别使用 Microsoft.Net.Compilers?

    我想开始使用Microsoft Net Compilers https www nuget org packages Microsoft Net Compilers 简化我们的构建服务器的工作 但是 我只能让它在每个项目级别 https s
  • 木偶如何判断变量是否已设置

    在木偶类中 我应该如何测试变量是否已设置 现在我只是检查变量是否未定义 if http port undef run command run command http port http port 有没有更好的方法来检查变量是否已声明 如果
  • 如何在视图中使用Django缓存而不缓存所有页面

    我尝试使用 Django Cache 来改善我的观点 效果很好 400 毫秒到 8 毫秒是完美的 但是当用户第一次访问页面时 Django 会在标题中缓存包含用户信息的页面 当我尝试注销时 页面会继续包含用户信息 我也尝试在模板中使用缓存
  • 使用 ionic 构建网站的移动网页版本是个好主意吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在一家初创公司工作 我们决定拥有一个自适应网站而不是响应式网站 因此我们基本上为不同设备提供不同的视图 以便我们为两端 移动 桌面
  • 禁用 Oreo 中的状态栏拉动

    通过禁用状态栏的拉动和单击来 kiosk 应用程序的方法在 android 8 上不起作用 Android中如何禁用状态栏点击和下拉 https stackoverflow com questions 29969086 how to dis
  • Woocommerce 结账页面显示订单摘要 2 次?

    On the checkout page when user checkbox for the shipping details the order summary doubles I have done many modification
  • 输入字段的自动焦点属性在 IE 11 中不起作用

    我似乎无法在 IE 11 中使用它 我创建了一个非常简单的 jsfiddle http jsfiddle net 0qwbr7gh http jsfiddle net 0qwbr7gh 有如下输入框
  • TensorFlow 函数检查一个值是否在给定范围内?

    我知道有tf greater x y 如果 x gt y 按元素 则返回 true 如果张量 x 的 lower bound 没有特定的功能 但您可以组合使用tf greater tf less and tf logical and得到相同
  • 与 .annotate() 结合使用时,Django 查询集联合似乎不起作用

    我有以下查询集 photos Photo objects all 我过滤掉两个查询 a photos filter gallery name NGL b photos filter gallery name NGA 我将它们加在一起 它们形