zoukankan      html  css  js  c++  java
  • 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的去重查询方式。

  • 相关阅读:
    JAVA高级编程数据源datasource

    编写自己的JDBC框架
    libevent带负载均衡的多线程使用示例
    游戏数据分析-基本指标
    学习日记-----各种问题
    学习日记-----ORM
    【转】Delphi利用系统环境变量获取常用系统目录
    [转]Delphi多线程编程入门(二)——通过调用API实现多线程
    [转]Delphi多线程编程入门(一)
  • 原文地址:https://www.cnblogs.com/cpl9412290130/p/11777633.html
Copyright © 2011-2022 走看看