这篇笔记将介绍 reverse、distinct、values 和 values_list 的用法。

本篇笔记目录如下:

  1. reverse()
  2. values()
  3. values_list()
  4. distinct()
  5. using()

1、reverse()

对 QuerySet 返回的结果进行反转,使用方法如下:

  1. from blog.models import Blog
  2. Blog.objects.filter(id__gte=2).reverse()

通过 reverse() 方法,可以使原本是某个顺序的数据顺序倒转返回。

2、values()

如果不使用 values() 方法,QuerySet 会返回 model 的所有字段,通过 obj.field_name 即可获取。

比如:

  1. blog_obj = Blog.objects.all()[0]
  2. blog_obj.name

如果我们在操作的时候仅仅想获取某一个或者某几个字段数据,则可以使用 values() 函数。

指定字段

如果是使用 values() 方法,则会仅仅返回相应字段的字典列表,比如:

  1. name_dict_list = Blog.objects.values("name")

name_dict_list 数据则为:

  1. <QuerySet [{'name': 'python3'}, {'name': 'hunter'}, {'name': 'a'}]>

name_dict_list 可以通过下标,访问到单条数据。

  1. >>> name_dict_list[0]
  2. {'name': 'python3'}
  3. >>> name_dict_list[0].get('name')
  4. 'python3'

不指定字段

如果我们使用的时候不指定 values() 函数的参数,返回的则是该 model 所有字段的字典列表,比如说 Blog 这个 model 的字段为 id、name、tagline 三个,那么返回的是包含所有字段的字典列表,使用:

  1. Blog.objecrs.filter(id=1).values()

返回的是:

  1. <QuerySet [{'id': 1, 'name': 'hunter', 'tagline': 'asd'}]>

处理字段值返回

还可以对 values 指定的字段值进行处理后返回,比如全部都小写:

  1. from django.db.models.functions import Lower
  2. Blog.objects.values(lower_name=Lower('name'))

获取外键字段

也可以获取外键字段,指定外键加上双下划线和字段名即可:

  1. Entry.objects.values('blog__name')

3、values_list()

values() 函数返回的结果是字典列表,列表里的元素是一个个的字典。

values_list() 函数返回的则是元组列表,效果如下:

  1. Entry.objects.values_list('id', 'headline')
  2. <QuerySet [(1, '123'), (2, 'wwwqeq')]>

如果我们需要获取的仅有一个字段,返回的也是一个元组列表,但是为了方便,我们也可以变成列表格式,加上 flat 参数即可。

注意: 这种情况仅存在于所需要获取的字段为一个的时候。

  1. Entry.objects.values_list('id', flat=True)
  2. <QuerySet [1, 2]>

这种方法比较好用,所以我常常在项目中使用。

4、distinct()

相当于 mysql 的 DISTINCT 的用法,这个用法需要用到前面介绍的 values() 方法。

使用方法如下:

  1. Blog.objects.values("name").distinct()

5、using()

有时候,我们在 Django 项目中用到不止一个数据库,如果还用上了其他数据库,这些配置会在 settings.py 的 DATABASES 参数中配置。

比如:

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME': 'db1',
  5. "USER": "root",
  6. "PASSWORD": "xxx",
  7. "HOST": "192.168.10.100",
  8. "PORT": 3306,
  9. },
  10. 'other': {
  11. 'ENGINE': 'django.db.backends.mysql',
  12. 'NAME': 'db2',
  13. "USER": "root",
  14. "PASSWORD": "xxx",
  15. "HOST": "192.168.10.101",
  16. "PORT": 3306,
  17. }
  18. }

那么如果我们要使用到 other 数据库的数据,则会用上 using()。

假设 TestModel 是属于 db2 数据库的,那么使用方法如下:

  1. TestModel.objects.using('other').all()

其实我们一直使用的查询都是默认的指向 default 数据库的,所以就省略了 using() 用法,所以以下两种方法是等效的:

  1. Blog.objects.all()
  2. Blog.objects.using('default').all()

以上就是本篇笔记所有内容,接下来会介绍外键相关的 select_related、prefetch_related 等用法,它能够帮助我们在访问数据库的时候减少对数据库的访问次数。

本文首发于本人微信公众号:Django笔记。

原文链接:Django笔记十之指定字段取值及distinct去重处理

如果想获取更多相关文章,可扫码关注阅读:

Django笔记十之values_list指定字段取值及distinct去重处理的更多相关文章

  1. C# SQLiteDataReader获得数据库指定字段的值

    获得数据库指定字段的值,赋给本地变量 (1)如下,获得userinfo数据表里的字段"userid"."orgid", string userid=" ...

  2. 把一个select查询结果插入到一个表(可选指定字段和值实例)

    把一个select查询结果插入到一个表(可选指定字段和值实例) insert into  bak (cc,yf) select cc,9 from ket insert into bak (cc,yf ...

  3. MySQL 自增字段取值

    1 前言 本文来自回答思否网友的一个问题,这个网友新建了一张表,auto_increment_increment设为10,AUTO_INCREMENT主键起始值设为9, 当他插入数据的时候,发现主键值 ...

  4. Django笔记(2)Json字段处理

    1) Django里面让Model用于JSON字段,添加一个JSONField自动类型如下: [python] view plain copy class JSONField(models.TextF ...

  5. 获取请求 header 中指定字段的值

    private function getHeader($name) {//获取请求头中$name的值 $name = 'HTTP_' . $name; foreach ($_SERVER as $ke ...

  6. odoo开发笔记 -- tree视图按指定字段group_by分组显示

    注意点: view视图文件中的搜索视图要放在action视图的前边. 在action视图中,要写search_view_id, 还有context, search_default_group_by_字 ...

  7. [转]Hibernate查询对象所有字段,单个字段 ,几个字段取值的问题

    原文地址:http://www.ablanxue.com/prone_3552_1.html 1. 查询整个映射对象所有字段 Java代码 //直接from查询出来的是一个映射对象,即:查询整个映射对 ...

  8. Oracle批量更改所有表的字段取值_类型_原字段名

    CREATE PROCEDURE 存储过程名称 is cursor c_tab is select * from user_tab_columns t r_tab user_tab_columns%r ...

  9. Entity Framwork(EF) 7——在Controller内获取指定字段的值

    一.开发背景: 在用户登录的时候,验证用户和密码是否正确.验证通过后将用户名和用户ID保存下来以便后续数据更新时使用. 二.用户验证方法: 1.创建DBContext 对象. ApplicationD ...

  10. laravel 查询指定字段的值

    $this->model->where('id',$id)->value('user');

随机推荐

  1. Docker之基本原理介绍

    Docker 环境搭建请移步:https://i.cnblogs.com/posts/edit;postId=14090026 First:docker能做什么? 传统的环境部署: 1.环境和项目分开 ...

  2. 微信小程序开发常见问题

    1.不同页面之间的传值方式 通过URL问号传值 当前页面 wx.navigateTo({ url: '/pages/aaa/aaa?/userName=norma' }) 2. 另一个页面通过opti ...

  3. pnn模型 待整理

    https://blog.csdn.net/qq_18293213/article/details/90262378?spm=1001.2101.3001.6650.5&utm_medium= ...

  4. PLC入门笔记5

    定时器指令及其应用 定时器指令介绍 设备启动预热时间.化学反应时间.电机星三角转换时间? 我们需要定时器.PLC计时器指令由时间续电器演变而来. 定时器本质是一个输出指令. 主要功能是,当输入端有能流 ...

  5. Android Native Code 手动调试

    调试启动过程中的 Android Native Code Crash 记录一下,最后成功使用的工具是 lldb + lldb-server,不需要 root 权限.我最先尝试使用的是,gdb + gd ...

  6. asp.net页面button按钮防止重复提交的方法

    网上找了一些实现方案都不行,就自己写了个用,还行. 先放javascript代码: <script type="text/javascript"> var clicks ...

  7. 【内存管理】ION内存管理器浅析(system contig heap)

    system contig heap与system heap 从代码中我们看到system contig heap与system heap同属一个文件中,ion_system_heap.c 相同点:它 ...

  8. 油猴CSDN净化脚本

    CSDN版面越来越乱,最近还总是弹出红包雨和顶部巨大横幅,左侧也会随机出现学生认证弹窗.而且版面混乱难看,看起来非常费劲. 另外底下的推荐列表经常夹杂着CSDN文件下载的链接,下载文件又要付费,从来不 ...

  9. CV入坑

    https://www.cnblogs.com/fldev/p/14360149.html

  10. .net创建、发布、引用webservice项目

    创建webservice引用 增加代码: 运行如下: 之后就可以发布我们的项目了,右击项目,选择发布: 此地址不要选择项目地址,另外创建一个地址: 至此,发布成功,接下来iis增加web网站: 这里i ...