使用 django orm 写 exists 条件过滤实例
要用django的orm表达sql的exists子查询,是个比较麻烦的事情,需要做两部来完成
fromdjango.db.modelsimportExists,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
补充知识:关于使用djangoorm时的坑
跨app时外键报错
classHost(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') classHostToApp(models.Model): hobj=models.ForeignKey(to=‘Host',to_field=‘nid') aobj=models.ForeignKey(to=‘Application',to_field=‘id') classApplication(models.Model): name=models.CharField(max_length=32)
以上model都在一个models文件下时不会报错。但是一旦出现跨app时会报以下错误:
users.HostToApp.aobj:(fields.E300)Fielddefinesarelationwithmodel‘Application',whichiseithernotinstalled,orisabstract.
users.HostToApp.aobj:(fields.E307)Thefieldusers.HostToApp.aobjwasdeclaredwithalazyreferenceto‘users.application',butapp‘users'doesn'tprovidemodel‘application'.
解决方案:
1、
fromxxxx.modelsimportApplication
2、
classHostToApp(models.Model): hobj=models.ForeignKey(to=‘Host',to_field=‘nid') aobj=models.ForeignKey(to=‘xxxx.Application',to_field=‘id')
第二步很重要
以上这篇使用djangoorm写exists条件过滤实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。