日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

关于Django中的数据库操作API之distinct去重的一个误传

發布時間:2025/3/15 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Django中的数据库操作API之distinct去重的一个误传 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

django提供的數據庫操作API中的distinct()函數,了解SQL語句的讀者都應該知道,DISTINCT關鍵字可以在select操作時去重。django里的這個distinct()函數也是這個功能,通常的用法是我們要取出一張表中的某一列的所有值,并且只取出不重復的,如果有重復的就只取出來一次,網絡上幾乎所有的對這個函數的使用例子對應的Python代碼都如下:

但是這樣的用法往往達不到使用者的意圖,可以來看一下網絡上流傳甚廣的一個問答:
比如這個:http://bbs.csdn.net/topics/330006477
再比如這個:http://www.douban.com/group/topic/17856879/
這里其實說的都是一個例子,仔細看這個解答

—–
需要注意的是,這樣返回的是一個字典的列表,而不是通常的 QuerySet

這樣是過濾不掉的,這是個問題,還是有5個對象在里面,對結果使用len(obj)就知道沒有任何變化,但是如果只作統計不重復數據的個數的話,還是準確的3個
obj=ClassName.objects.values(‘name’).distinct()
len(obj)=5
obj.count()=3
但是結果集中沒有起到任何的過濾作用,此問題有待解決!!!!!

有理有據,讓人很信服的認為distinct()函數沒有實現其所描述的功能。真的是這樣么?

在這里負責的告訴讀者,上面的解釋是錯誤的,distinct()具有去重功能是沒有必要懷疑的,那為什么會出現上面的解釋呢?因為他不知道distinct()函數有一個隱藏特性,當使用distinct()函數的時候,如果不使用order_by()函數做跟隨,那么該函數會自動把當前表中的默認排序字段作為DISTINCT的一個列,所以上述問題出現的原因是因為他沒有使用order_by(‘name’)來屏蔽distinct()的那個特性,從而得出的distinct結果并不是僅僅以name一個列作為參數的,而是以id+name兩列的值作為distinct參數,可以看到id列里面的值全部都是唯一值,所以得出來的結果必然是以id列的值為標準的,這也就是的原因,而如果想要實現上述例子中樓主的需求,正確的代碼寫法是:

Python

1

ClassName.objects.values('name').distinct() .order_by('name')

在1.4+版本的django中distinct()函數可以傳入一個參數,從而省去了后面跟加一個order_by()函數的必要,但是這也需要你的數據庫支持Postgresql,否則還是無效的。

訪問具體數據:

因為此處查詢到的i類型為dict類型。c是QuerySet類型

轉載自http://www.360doc.com/content/18/0731/18/58287567_774731201.shtml

總結

以上是生活随笔為你收集整理的关于Django中的数据库操作API之distinct去重的一个误传的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。