使用 django orm 写 exists 条件过滤实例


Posted in Python onMay 20, 2020

要用django的orm表达sql的exists子查询,是个比较麻烦的事情,需要做两部来完成

from django.db.models import Exists, OuterRef
 
# 1. 定义子查询条件
relative_comments = Comment.objects.filter(
 post=OuterRef('pk'), # 注意外键关联方式:post为Comment表的字段,pk表示关联另一表主键
)
 
# 2. 使用annotate和filter共同定义子查询
Post.objects.annotate( # 使用exists定义一个额外字段
 recent_comment=Exists(recent_comments),
).filter(recent_comment=True) # 在条件中通过检查额外字段实现exists子查询过滤

这种方式比较麻烦,有其它简便方式的欢迎分享

官网参考: https://docs.djangoproject.com/en/2.1/ref/models/expressions/#filtering-on-a-subquery-expression

补充知识:关于使用django orm 时的坑

跨app 时外键报错

class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32, db_index=True)
ip = models.GenericIPAddressField(protocol=“ipv4”, db_index=True)
port = models.IntegerField()
# b = models.ForeignKey(to=“Business”, to_field=‘id')

class HostToApp(models.Model):
hobj = models.ForeignKey(to=‘Host', to_field=‘nid')
aobj = models.ForeignKey(to=‘Application', to_field=‘id')

class Application(models.Model):
name = models.CharField(max_length=32)

以上 model 都在一个models 文件下时不会报错。 但是一旦出现跨app 时会报以下错误:

users.HostToApp.aobj: (fields.E300) Field defines a relation with model ‘Application', which is either not installed, or is abstract.
users.HostToApp.aobj: (fields.E307) The field users.HostToApp.aobj was declared with a lazy reference to ‘users.application', but app ‘users' doesn't provide model ‘application'.

解决方案:

1、

from xxxx.models import Application

2、

class HostToApp(models.Model):
hobj = models.ForeignKey(to=‘Host', to_field=‘nid')
aobj = models.ForeignKey(to=‘xxxx.Application', to_field=‘id')

第二步很重要

以上这篇使用 django orm 写 exists 条件过滤实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的迭代器与生成器高级用法解析
Jun 28 Python
python中利用Future对象异步返回结果示例代码
Sep 07 Python
Python反射用法实例简析
Dec 22 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
Jun 27 Python
python之super的使用小结
Aug 13 Python
ORM Django 终端打印 SQL 语句实现解析
Aug 09 Python
python 实现视频 图像帧提取
Dec 10 Python
Python 实现日志同时输出到屏幕和文件
Feb 19 Python
Python如何使用paramiko模块连接linux
Mar 18 Python
Python 通过监听端口实现唯一脚本运行方式
May 05 Python
Python Pandas读取Excel日期数据的异常处理方法
Feb 28 Python
Python中request的基本使用解决乱码问题
Apr 12 Python
django 解决自定义序列化返回处理数据为null的问题
May 20 #Python
python实现126邮箱发送邮件
May 20 #Python
python3.6使用SMTP协议发送邮件
May 20 #Python
Python操作Excel把数据分给sheet
May 20 #Python
python3通过qq邮箱发送邮件以及附件
May 20 #Python
学会python自动收发邮件 代替你问候女友
May 20 #Python
Django中ORM找出内容不为空的数据实例
May 20 #Python
You might like
精通php的十大要点(上)
2009/02/04 PHP
基于php实现长连接的方法与注意事项的问题
2013/05/10 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
PHP7+Nginx的配置与安装教程详解
2016/05/10 PHP
jquery选择器使用详解
2014/04/08 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
javascript限制文本框输入值类型的方法
2015/05/07 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
JS常用正则表达式总结【经典】
2017/05/12 Javascript
JS实现评价的星星功能
2017/08/20 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
2018/01/09 jQuery
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
javaScript中indexOf用法技巧
2019/11/26 Javascript
微信小程序自定义弹出层效果
2020/05/26 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
在python中的socket模块使用代理实例
2014/05/29 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
用Pygal绘制直方图代码示例
2017/12/07 Python
django 连接数据库 sqlite的例子
2019/08/14 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
CSS3 毛玻璃效果
2019/08/14 HTML / CSS
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
国际花店:Pickup Flowers
2020/04/10 全球购物
员工年终自我评价
2014/09/14 职场文书
工作收入住址证明
2014/10/28 职场文书
中国合伙人观后感
2015/06/02 职场文书
python中对列表的删除和添加方法详解
2022/02/24 Python