Django使用distinct報錯:DISTINCT ON fields is not supported by this database backend


具體錯誤提示是:django.db.utils.NotSupportedError: DISTINCT ON fields is not supported by this database backend

剛好遇到mysql數據庫查重,使用distinct方法來做去重查詢,結果遇到這個錯誤。先看一下distinct的源碼:

1 def distinct(self, *field_names):
2     """
3     Return a new QuerySet instance that will select only distinct results.
4     """
5     assert self.query.can_filter(), \
6         "Cannot create distinct fields once a slice has been taken."
7     obj = self._chain()
8     obj.query.add_distinct_fields(*field_names)
9     return obj

使用distinct會返回一個新的查詢集合,會顯示不重復的結果,達到去重的目的。我們可以看到它接受的是一個或多個field_names參數,也就是各字段名稱。

我寫的錯誤寫法:u.objects.all().distinct('address')

 這是報的錯誤。。。根據提示說明distinct不支持當前的數據庫。

我們可以去官網看一下這個字段的說明:https://docs.djangoproject.com/en/2.2/ref/models/querysets/#distinct

官網提到了上面這種錯誤的寫法,在mysql中是不支持的,支持postgresql,也就是distinct()里面不能指定字段。

錯誤解決

不能這樣,那我們可以把數據寫到values或者values_list里面去不就好了。

查詢語句如下:

u.objects.filter(user_id=1).values('address', "signer_name", 'signer_mobile').distinct()

輸出結果如下:

<QuerySet [{'address': '188號藍天國際大廈', 'signer_name': 'admin', 'signer_mobile': '1888888888'}, {'address': '中原路188號', 'signer_name': '', 'signer_mobile': '2222222222'}, {'address': '南關街14號', 'signer_name': '劉雨辰', 'signer_mobile': '3333333333'}, {'address': '麓山南路麓山門', 'signer_name': '湖南大學', 'signer_mobile': '888888888'}, {'address': '安徽省合肥市金寨路 96 號', 'signer_name': '中國科學技術大學', 'signer_mobile': '666666666'}]>

對應於SQL語句:

1 SELECT DISTINCT address, signer_name, signer_mobile FROM user_operation_useraddress WHERE user_id=1;    // 去重查詢語句
2 
3 SELECT COUNT(*) as repetitions, address, signer_name, signer_mobile FROM user_operation_useraddress GROUP BY address, signer_name, signer_mobile;    // 去重查詢以及字段數量統計
4 
5 SELECT COUNT(*) as repetitions, address, signer_name, signer_mobile FROM user_operation_useraddress GROUP BY address, signer_name, signer_mobile HAVING repetitions > 1;    // 去重查詢,字段記錄數量統計大於1條的

以上就是mysql環境下,django的去重查詢方式。


免責聲明!

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



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