关于Django中的数据库操作API之distinct去重的一个误传
django提供的數(shù)據(jù)庫(kù)操作API中的distinct()函數(shù),了解SQL語句的讀者都應(yīng)該知道,DISTINCT關(guān)鍵字可以在select操作時(shí)去重。django里的這個(gè)distinct()函數(shù)也是這個(gè)功能,通常的用法是我們要取出一張表中的某一列的所有值,并且只取出不重復(fù)的,如果有重復(fù)的就只取出來一次,網(wǎng)絡(luò)上幾乎所有的對(duì)這個(gè)函數(shù)的使用例子對(duì)應(yīng)的Python代碼都如下:
但是這樣的用法往往達(dá)不到使用者的意圖,可以來看一下網(wǎng)絡(luò)上流傳甚廣的一個(gè)問答:
比如這個(gè):http://bbs.csdn.net/topics/330006477
再比如這個(gè):http://www.douban.com/group/topic/17856879/
這里其實(shí)說的都是一個(gè)例子,仔細(xì)看這個(gè)解答
—–
需要注意的是,這樣返回的是一個(gè)字典的列表,而不是通常的 QuerySet
—
這樣是過濾不掉的,這是個(gè)問題,還是有5個(gè)對(duì)象在里面,對(duì)結(jié)果使用len(obj)就知道沒有任何變化,但是如果只作統(tǒng)計(jì)不重復(fù)數(shù)據(jù)的個(gè)數(shù)的話,還是準(zhǔn)確的3個(gè)
obj=ClassName.objects.values(‘name’).distinct()
len(obj)=5
obj.count()=3
但是結(jié)果集中沒有起到任何的過濾作用,此問題有待解決!!!!!
有理有據(jù),讓人很信服的認(rèn)為distinct()函數(shù)沒有實(shí)現(xiàn)其所描述的功能。真的是這樣么?
在這里負(fù)責(zé)的告訴讀者,上面的解釋是錯(cuò)誤的,distinct()具有去重功能是沒有必要懷疑的,那為什么會(huì)出現(xiàn)上面的解釋呢?因?yàn)樗恢纃istinct()函數(shù)有一個(gè)隱藏特性,當(dāng)使用distinct()函數(shù)的時(shí)候,如果不使用order_by()函數(shù)做跟隨,那么該函數(shù)會(huì)自動(dòng)把當(dāng)前表中的默認(rèn)排序字段作為DISTINCT的一個(gè)列,所以上述問題出現(xiàn)的原因是因?yàn)樗?strong>沒有使用order_by(‘name’)來屏蔽distinct()的那個(gè)特性,從而得出的distinct結(jié)果并不是僅僅以name一個(gè)列作為參數(shù)的,而是以id+name兩列的值作為distinct參數(shù),可以看到id列里面的值全部都是唯一值,所以得出來的結(jié)果必然是以id列的值為標(biāo)準(zhǔn)的,這也就是的原因,而如果想要實(shí)現(xiàn)上述例子中樓主的需求,正確的代碼寫法是:
Python
| 1 | ClassName.objects.values('name').distinct() .order_by('name') |
在1.4+版本的django中distinct()函數(shù)可以傳入一個(gè)參數(shù),從而省去了后面跟加一個(gè)order_by()函數(shù)的必要,但是這也需要你的數(shù)據(jù)庫(kù)支持Postgresql,否則還是無效的。
訪問具體數(shù)據(jù):
因?yàn)榇颂幉樵兊降膇類型為dict類型。c是QuerySet類型
轉(zhuǎn)載自http://www.360doc.com/content/18/0731/18/58287567_774731201.shtml
總結(jié)
以上是生活随笔為你收集整理的关于Django中的数据库操作API之distinct去重的一个误传的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mixin机制 vue_vue mixi
- 下一篇: jmeter模拟压测真实复杂用户场景,阶