Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何使用一个案例或合并表达式来过滤Django查询集?

我如何使用一个案例或合并表达式来过滤Django查询集?
EN

Stack Overflow用户
提问于 2018-01-15 12:13:19
回答 3查看 3.8K关注 0票数 1

我基于一个功能良好的postgres查询作为Django查询集的基础,该查询具有以下WHERE条件:

代码语言:javascript
运行
AI代码解释
复制
... WHERE COALESCE("project_story"."owner_id" = [INSERT_USER_ID], "project_story"."published_date" IS NOT NULL)

如果用户是故事的所有者,那么就包括这个故事。如果用户不是所有者,如果故事没有发布,那么就排除它。

理想情况下,Django ORM应该允许这样的内容:

代码语言:javascript
运行
AI代码解释
复制
    queryset = queryset.filter(
        Coalesce(
            Q(owner_id=user.id),
            Q(published_date__isnull=False)
        )
    )

但在执行时,Django抛出错误:

TypeError:“合并”对象不可迭代

不幸的是,我需要在数据库级别进行条件过滤。

是否有一种符号或方法允许使用合并表达式进行选择?

我不喜欢使用rawsql或queryset.extra。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-15 18:58:35

我自己想出来的。由于还没有发布真正的答案,以下是我的解决方案:

代码语言:javascript
运行
AI代码解释
复制
        return queryset.all().annotate(
            viewable=Case(
                When(owner_id=user.id, then=True),
                When(published_date__isnull=False, then=True),
                default=False,
                output_field=db.models.BooleanField()
            ),
        ).filter(
            viewable=True
        )

很难读,不是吗?由此产生的SQL也同样丑陋:

代码语言:javascript
运行
AI代码解释
复制
AND CASE WHEN ("project_story"."owner_id" = [INSERT USER ID]) THEN True WHEN ("project_story"."published_date" IS NOT NULL) THEN True ELSE False END = True) ORDER BY "project_story"."image_count" DESC

虽然使用CASE可以得到与原始查询相同的结果,但我仍然希望代码不那么冗长。

在那之前,我会把我的问题记下来。

票数 3
EN

Stack Overflow用户

发布于 2022-05-30 16:57:34

编写自己的表达式类的代码片段的开头很小,有关完整源代码,请参阅下面的正式文档链接。

注意:并不是所有的数据库都有连接(),我认为这就是为什么这已经不是一个正式的表达式了。也许可以编写一些代码,将其转换为标准情况(.)表达式作为回退,然后对db特定的sql转换使用COALESCE()。我把它留给读者做练习;)

代码语言:javascript
运行
AI代码解释
复制
from django.db.models import Expression

class Coalesce(Expression):
    template = 'COALESCE( %(expressions)s )'

    ...

完整代码的正式文档:Django模型-编写您自己的查询表达式

票数 0
EN

Stack Overflow用户

发布于 2018-01-15 14:35:48

我相信Q()的结果总是真或假,所以在合并表达式中使用它是行不通的。解决方案是使用条件表达式,结合大小写和过滤器。您可以在文档中找到所有需要这里的信息。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48270038

复制
相关文章
Django ModelChoiceField:修改过滤查询集 queryset的两种方法
Django Form类定义中有一个 ModelChoiceField  对应的是Model 的外键,queryset 是返回一个查询集对象
KEVINGUO_CN
2020/04/26
1.6K0
Django 2.1.7 查询集 QuerySet
上一篇Django 2.1.7 模型 - 条件查询 F对象 Q对象 聚合查询讲述了关于Django模型的介绍F对象、Q对象、聚合查询等功能。
Devops海洋的渔夫
2019/06/15
1.2K0
18. Django 2.1.7 查询集 QuerySet
上一篇Django 2.1.7 模型 - 条件查询 F对象 Q对象 聚合查询讲述了关于Django模型的介绍F对象、Q对象、聚合查询等功能。
Devops海洋的渔夫
2022/01/17
8020
18. Django 2.1.7 查询集 QuerySet
Django REST Framework-如何使用过滤器
Django REST Framework (DRF) 是一个开源的 Web 框架,它建立在 Django 上,可以帮助你轻松地构建 RESTful API。DRF 提供了很多有用的功能,其中之一就是过滤器(filters)。
玖叁叁
2023/04/25
2.1K0
Hibernate合并查询结果集为实体类
用过mybatis的小伙伴可能都知道,我们可以查询两个表的部分字段合并为一个实体。然而用了Hibernate这么久了,居然还不知道也有此神器。 hibernate.jpg 说明 一般来说,Hibern
小柒2012
2018/04/16
2.1K0
Hibernate合并查询结果集为实体类
Hibernate合并查询结果集为实体类
用过mybatis的小伙伴可能都知道,我们可以查询两个表的部分字段合并为一个实体。然而用了Hibernate这么久了,居然还不知道也有此神器。
小柒2012
2019/12/05
1.5K0
一个分页排序SQL查询结果集不确定的案例
前些日子碰巧看了杨长老这篇文章:《让SQL成为一种生活方式:认识分页查询》,以下为原文摘要:
bisal
2019/03/01
1.5K0
一个分页排序SQL查询结果集不确定的案例
[742]Flask数据库过滤器与查询集
flask-sqlalchemy所作的操作只是把模型类转换为sql语句,然后通过数据库驱动访问mysql,在获取到结果后再把数据转换为模型对象
周小董
2020/01/13
7.1K0
Django 聚合与查询集API实现侧边栏
1. 聚合的产生来源于django数据库查询,通常我们使用django查询来完成增删查改,但是有时候需要更复杂的方法才能完成对数据的提取、筛选、更改,所以需要一组对象聚合来完成这种操作。模型举例如下:
菲宇
2020/03/20
1.5K0
HQL查询-分页-条件-连接-过滤使用
HQL(Hibernate Query Language)是hibernate自带的查询语言,进行了面向对象的分装,今天就来学习一下,
全栈程序员站长
2022/08/31
2.8K0
HQL查询-分页-条件-连接-过滤使用
django queryset 合并
1. 通过自带的方法: a1 = User.objects.filter(id__gt=8) a2 = User.objects.filter(id__lt=4) a3 = a1 | a2 注:这种方式合并的结构还是一个queryset,相当于a3把a1和a2的条件合并了,推荐,因为可以用order_by等函数了 只能合并同种model对象的数据 2. 用python的chain合并 from itertools import chain a1 = User.objects.filter(id__
kirin
2020/11/05
7990
使用联接和子查询来查询数据
--Chapter 3 使用联接和子查询来查询数据 --内容提要 go /* (一)、使用联接查询数据 1. 内联接 2. 外联接 3. 交叉联接 4. 等值联接 5. 自联接 */ go /* (二)、使用子查询查询数据 1. 使用比较运算符,IN和EXISTS关键字 2. 使用修改过的比较运算符 3. 使用聚合函数 4. 使用嵌套子查询 5. 使用关联子查询 6. APPLY运算符 */ go /* (三)、管理结
赵腰静
2018/03/09
2.3K0
使用awk和正则表达式过滤文件中的文本或字符串
当我们在 Unix/Linux 中运行某些命令来读取或编辑字符串或文件中的文本时,我们很多时候都会查找指定特征的字符串。这可能会使用正则表达式。 什么是正则表达式? 正则表达式可以定义为表示多个字符序列的字符串。关于正则表达式的最重要的事情之一是它们允许你过滤命令或文件的输出、编辑文本或配置文件的一部分等等。 正则表达式的特点 正则表达式由以下组成: Ordinary characters 例如空格、下划线(_)、AZ、az、0-9。 Meta characters 扩展为普通字符,它们包括: (.) 它匹
入门笔记
2022/06/02
2.4K0
django自定义过滤器-评论时间记录案例
#自定义过滤器实战之评论时间记录 实际效果 该评论来自:5分钟之前 from datetime import datetime # register.filter(‘greet’,greet)这一句和下面是一样的功能,注册过滤器 如果filter没有传入参数的话将会使用这个函数的名字作为过滤器的名字,也就是time_since
kirin
2020/05/09
4360
django 人机校验我是人类-使用hCaptcha或Turnstile代替simple-captcha
首先,确保你已经完成了django知识的学习, 以便不出现未经了解且不易理解的错误,本文不会叙述基础教程,如若此, 请跳转至djangoproject官网教程.
zmh-program
2023/02/06
1.8K0
GIS常用npm包:GeoJSON文件合并与元素过滤\属性过滤\图形合并
普通的geoJSON文件合并,只需geojson-merge插件就够了,https://www.npmjs.com/package/@mapbox/geojson-merge
周陆军博客
2023/04/09
1.6K0
django合并多个queryset
这几天正在做一个关于权限控制的django框架,今天上午遇见了一个bug,因为我的需求是,每个人拥有的权限不同,所以你所能够访问的菜单也不同,那么这时候不同的人员访问不同的菜单是不一样的。
kirin
2020/11/23
2.8K0
点击加载更多

相似问题

如何过滤Django查询集

25

Django过滤查询集

12

Django过滤查询集-

20

过滤django查询集

29

如何过滤django模型集的查询集

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档