關於Django ORM filter方法小結

2021-07-15 07:12:57 字數 2176 閱讀 9807

django filter是乙個過濾器,相當於sql的select * from where。

filter返回乙個queryset物件,還可以在該物件上繼續進行django orm 該有的操作。

有幾點需要注意。我們以該鏈結的幾個model盡心說明。 models鏈結

如果我們刷選出blog表中的name為pcf, tagline包含』django study』的部落格。我們可以有這兩種簡單的filter使用方法。

>>>blog.objects.filter(name='pcf', tagline__contains='django study')    # 方法一

>>>blog.objects.filter(name='pcf').filter(tagline__contains='django study') # 方法二

當然我們還有其餘的方法比如使用q物件,還可以使用原生sql。在這裡簡單列一下q物件使用

>>>from django.db.models import q

>>>blog.objects.filter(q(name='pcf')&q(tagline__contains='django study'))

filter 在使用就是這麼簡單。具體可以參考文件

本篇部落格著重介紹filter在跨越多值的關聯關係的使用情況時需要注意的地方。

跨越多值的關聯關係

當你基於manytomanyfield 或反向的foreignkey 來過濾乙個物件時,有兩種不同種類的過濾器。考慮blog/entry 關聯關係(blog 和 entry 是一對多的關係)。我們可能想找出headline為「lennon」 或publish為』2008』年的entry。或者我們可能想查詢包headline為「lennon」 的entry以及published為』2008』的entry。因為實際上有和單個blog 相關聯的多個entry,所以這兩個查詢在某些場景下都是有可能並有意義的。

manytomanyfield 有類似的情況。例如,如果entry 有乙個manytomanyfield 叫做 tags,我們可能想找到tag 叫做「music」 和「bands」 的entry,或者我們想找乙個tag 名為「music」 且狀態為「public」的entry。

對於這兩種情況,django 有種一致的方法來處理filter() 呼叫。乙個filter() 呼叫中的所有引數會同時應用以過濾出滿足所有要求的記錄。接下來的filter() 呼叫進一步限制物件集,但是對於多值關係,它們應用到與主模型關聯的物件,而不是應用到前乙個filter() 呼叫選擇出來的物件。

這些聽起來可能有點混亂,所以希望展示乙個例子使它變得更清晰。選擇所有包含同時滿足兩個條件的entry的blog,這兩個條件是headline 包含lennon 和發表時間是2008 (同乙個entry 滿足兩個條件),我們的**是:

>>>blog.objects.filter(entry__headline__contains='lennon',entry__pub_date__year=2008)
從所有的blog模型例項中選擇滿足以下條件的blog例項:blog的enrty的headline屬性值是「lennon」,或者entry的發表時間是2008(兩個條件至少滿足乙個,也可以同時滿足),我們的**是:

>>>blog.objects.filter(entry__headline__contains='lennon').filter(entry__pub_date__year=2008)
假如只有乙個blog 物件同時含有兩種entries,其中一種headline 包含「lennon」而另外一種發表時間是2008,但是沒有發表在2023年且headline 包含「lennon」 的entries。第乙個查詢不會返回任何blog,第二個查詢將會返回乙個blog。

在第二個例子中, 第乙個filter 限定查詢集中的blog 與headline 包含「lennon」 的entry 關聯。第二個filter 又 限定查詢集中的blog ,這些blog關聯的entry 的發表時間是2008。(譯者注:難點在如何理解further這個詞!)第二個filter 過濾出來的entry 與第乙個filter 過濾出來的entry 可能相同也可能不同。每個filter 語句過濾的是blog,而不是entry。

exclude 的使用和filter相似。在跨越多值的關聯關係也需要注意,詳情可見相關文件

關於程式關於世界

首先,在學了1年多的軟體設計的基礎上,問下自己 程式是什麼?業務需求是什麼?程式有什麼用?什麼是演算法?什麼是資料庫?或許每個人的理解不同,會給出不同的答案。那麼自己的理解 程式是乙個讓計算機工作的流程,在程式寫好之後,計算機就會按照,程式設計師定義好流程在執行。其實很多時候,乙個程式的好壞,在於乙...

關於血液關於軟體

1 自然沉降法 將血袋垂直吊掛於4 2 冰箱內,使紅細胞自然下沉1 3d,或將血袋呈70 80 角立於冰箱,需用時,用一次性分漿器分出血漿,制得濃縮紅細胞。2 洗滌法 一般用生理鹽水反覆洗滌3 6次。經洗滌的紅細胞,除白細胞和血小板減少外,血漿蛋白也極少,紅細胞中殘存的血漿蛋白含量約為原總蛋白的1 ...

關於冷漠,關於愛情

我不知道為什麼今天又莫名其妙開始思考愛情這件事,隨之就解決了我一直無法面對冷漠這件事 被冷漠是我始終無法消化的一件事,每當遇見冷漠時,我總會覺得就像一團火把自己燒得面目全非,但對方卻毫無傷害。但我突然懂了,遇到冷漠時,體面的離開即可 在乎你的人一定會在你離開後,找到你跟你解釋為什麼 連解釋都來不及,...