转载自http://www.360doc.com/content/18/0731/18/58287567_774731201.shtml

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)=
obj.count()=
但是结果集中没有起到任何的过滤作用,此问题有待解决!!!!!

有理有据,让人很信服的认为distinct()函数没有实现其所描述的功能。真的是这样么?

在这里负责的告诉读者,上面的解释是错误的,distinct()具有去重功能是没有必要怀疑的,那为什么会出现上面的解释呢?因为他不知道distinct()函数有一个隐藏特性,当使用distinct()函数的时候,如果不使用order_by()函数做跟随,那么该函数会自动把当前表中的默认排序字段作为DISTINCT的一个列,所以上述问题出现的原因是因为他没有使用order_by(‘name’)来屏蔽distinct()的那个特性,从而得出的distinct结果并不是仅仅以name一个列作为参数的,而是以id+name两列的值作为distinct参数,可以看到id列里面的值全部都是唯一值,所以得出来的结果必然是以id列的值为标准的,这也就是的原因,而如果想要实现上述例子中楼主的需求,正确的代码写法是:

Python

d1 = models.Device.objects.values('business_id').distinct().order_by('business_id')

在1.4+版本的django中distinct()函数可以传入一个参数,从而省去了后面跟加一个order_by()函数的必要,但是这也需要你的数据库支持Postgresql,否则还是无效的。

关于Django中的数据库操作API之distinct去重的一个误传的更多相关文章

  1. 数据库操作API 或万能的双下划线

    数据库操作API: 类型 描述 exact 精确匹配: polls.get_object(id__exact=14). iexact 忽略大小写的精确匹配: polls.objects.filter( ...

  2. 「Python-Django」Django中使用数据库的 9 个小技巧

    Django 中使用数据库的 9 个小技巧. 1. 过滤器聚合 在 Django 2.0 之前,如果你想得到“用户总数”.“活跃用户总数”等信息时,你不得不使用条件表达式. Django 2.0 中, ...

  3. Django【第5篇】:Django之ORM数据库操作

    django之ORM数据库操作 一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录-------- ...

  4. android中的数据库操作(转)

    android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   an ...

  5. android中的数据库操作(SQLite)

    android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   an ...

  6. Django中管理并发操作

    上一篇我们说了,如何在Django中进行事务操作,数据的原子性操作 涉及了事务操作,我们不得不考虑的另一个问题就是:并发操作 还是那个用户转账的操作 我们使用事务操作解决的操作中途服务器宕机问题 但是 ...

  7. [Django]中建立数据库视图

    Django中建立数据库视图 Django中没有建立视图的接口.假设要建立一个视图须要一些手动的改变. 这里使用的Django 版本号>1.5, 使用的数据库为mysql 第一步 建立视图,比如 ...

  8. CI中的数据库操作以及AR连贯操作

    要使用CI中的数据库操作,首先我们应该在CI的 application/config/databass.php 文件中配置数据库信息,通常就是配置主机名,用户名,密码,数据库名,表前缀(dbprefi ...

  9. Android中SQLite数据库操作(1)——使用SQL语句操作SQLite数据库

    下面是最原始的方法,用SQL语句操作数据库.后面的"Android中SQLite数据库操作(2)--SQLiteOpenHelper类"将介绍一种常用的android封装操作SQL ...

随机推荐

  1. CNN原理

    卷积神经网络(Convolutional Neural Network)的结构类似于神经网络,可以看做是对其的改进.它利用局部连接.权值共享.多核卷积.池化四个手段大大降低了参数的数目,使得网络的层数 ...

  2. java web添加spring jar 包

    maven依赖: <properties> <spring.version>5.1.7.RELEASE</spring.version> </properti ...

  3. 经典sql server基础语句不全

    1.几个简单的基本的sql语句 选择: select * from table1 where 范围 插入: insert into table1(field1,field2) values(value ...

  4. 你真的会使用 VMware Workstation 吗

    你真的会使用VMware Workstation吗?网上有很多教程,虽然都还可以,但总感觉差强人意.所以笔者在这里分享自己的使用心得,让大家参考一下,个人认为是最好的了. 简介 VMware Work ...

  5. linux设备驱动程序-设备树(0)-dtb格式

    linux设备树dtb格式 设备树的一般操作方式是:开发人员根据开发需求编写dts文件,然后使用dtc将dts编译成dtb文件. dts文件是文本格式的文件,而dtb是二进制文件,在linux启动时被 ...

  6. Python 简单批量请求接口实例

    #coding:utf-8 ''' Created on 2017年11月10日 @author: li.liu ''' import urllib import time str1=''' http ...

  7. 项目Alpha冲刺(团队)-测试篇

    格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队)-代码规范.冲刺任务与计划 团队名称:为了交项目干杯 测试用例:测试用例文档.zip 作业目标:描述项目的测试 ...

  8. Java学习 从0.1开始(一)

    写在前面: 之前从事过.NET,C,C++相关的开发,Java是一直没有学习的新领域.最近,应工作需要,开始学习Java相关的知识.又因为新公司并没有完整的系统架构,所以学习方向会侧重架构方向(Cod ...

  9. 实用Golang库

    框架: 1. Golang轻量级并发服务器框架: zinx / https://www.jianshu.com/p/23d07c0a28e52. 国内谢大牛模仿django制作的重框架: beego3 ...

  10. css实现硬件加速

    原文请点击一下链接: http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-c ...