使用 django orm 写 exists 条件过滤实例
要用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 条件过滤实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持好吧啦网。
相关文章:
1. Python使用pycharm导入pymysql教程2. Python如何把十进制数转换成ip地址3. python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)4. Python虚拟环境virtualenv创建及使用过程图解5. python点云地面点滤波(Progressive Morphological Filter)算法介绍(PCL库)6. Python定时从Mysql提取数据存入Redis的实现7. python为什么要安装到c盘8. python全栈开发语法总结9. Python使用Numpy模块读取文件并绘制图片10. python使用pywinauto驱动微信客户端实现公众号爬虫

网公网安备