溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用django orm寫exists條件過濾

發布時間:2020-07-23 09:57:15 來源:億速云 閱讀:664 作者:小豬 欄目:開發技術

小編這次要給大家分享的是如何使用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條件過濾的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女