關於Django ORM filter方法小結


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') # 方法二
  • 1
  • 2

當然我們還有其余的方法比如使用Q對象,還可以使用原生SQL。在這里簡單列一下Q對象使用

>>>from django.db.models import Q >>>Blog.objects.filter(Q(name='pcf')&Q(tagline__contains='django study'))
  • 1
  • 2

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)
  • 1

從所有的blog模型實例中選擇滿足以下條件的blog實例:blog的enrty的headline屬性值是“Lennon”,或者entry的發表時間是2008(兩個條件至少滿足一個,也可以同時滿足),我們的代碼是:

>>>Blog.objects.filter(entry__headline__contains='Lennon').filter(entry__pub_date__year=2008)
  • 1

假如只有一個blog 對象同時含有兩種entries,其中一種headline 包含“Lennon”而另外一種發表時間是2008,但是沒有發表在2008年且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相似。在跨越多值的關聯關系也需要注意,詳情可見相關文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM