我讀了django的檔案,我發現了一些令人困惑的地方!
我讀了django的檔案。 https://docs.djangoproject.com/en/3.2/topics/db/queries/#spanning-multi-valued-relationships。
據說"當你基于ManyToManyField或反向ForeignKey來過濾一個物件時,有兩種不同的過濾器你可能感興趣"
"要選擇所有包含標題中含有 "Lennon "的條目和在2008年發表的條目(同一條目滿足這兩個條件)的博客,我們要寫:"
Blog.objects.filter( entry__headline__contains='Lennon', entry__pub_date__year=2008)
"要選擇所有在標題中包含 "列儂 "的條目以及在2008年發表的條目的博客,我們要寫:"
"。Blog.objects.filter(entry__headline__contains='Lennon') 。 filter( entry__pub_date__year=2008)
"假設只有一個博客既有包含 "Lennon "的條目,又有2008年的條目,但2008年的條目中沒有包含 "Lennon"。第一個查詢將不會回傳任何博客,但第二個查詢將回傳那一個博客"
。因此,通過閱讀本指南,我的腦海中產生了多個問題:
1- 什么是區別?
1- 這兩種過濾方式有什么區別?我所知道的是,它們都必須回傳標題中包含'Lennon'并且是在2008年發表的博客。我找不到重點。
。2- 檔案中說這個規則只適用于ManyToManyField或反向外鍵。問題是,為什么?
uj5u.com熱心網友回復:
這兩種過濾方式的區別是什么?
這兩種過濾方式的區別是什么?
想象一下,你有一個Blog,有兩個(或多個)條目。其中一個條目的標題含有'Lennon'這個詞,但是不是寫于2008年,此外,該博客有一個條目沒有標題中的'Lennon'這個詞,但是寫于2008年。
帶有.filter(entry__headline__contains='Lennon', entry__pub_date__year=2008)的第一個查詢尋找一個在標題中包含'Lennon'的條目,并且這個條目應該寫于2008年。對于我們在第一段中定義的樣本資料,這將意味著這個Blog被不選中,因為這兩個條件適用于相同的條目。
另一方面,如果你把這個寫成.filter(entry__headline__contains='Lennon')。 filter(entry__pub_date__year=2008),Django將進行兩個LEFT OUTER JOINs,這意味著它尋找一個博客,其中一個條目的標題包含Lennon,并且一個條目(可以是一個不同的或相同的條目)寫于2008年。因此,這將檢索到第一段中定義的Blog。
檔案說這個規則只是針對ManyToManyField或反向的ForeignKey。問題是,為什么?
因為一個反向的ForeignKey是一個一對多的關系,而一個ManyToManyField跨越了一個多對多的關系。這里的...-to-many很重要。如果這將是一個...-to-one,那么根本不可能使一個Blog有兩個或更多的條目:如果一個Blog有一個ForeignKey到一個Entry模型,那么這意味著這個博客只能有一個條目,不能有多個。由于這樣就把條目的數量限制為一個,所以不可能有兩個或更多的條目,因此過濾將不區分這兩種情況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/323539.html
標籤:
