Django笔记十之values_list指定字段取值及distinct去重处理
这篇笔记将介绍 reverse、distinct、values 和 values_list 的用法。
本篇笔记目录如下:
- reverse()
- values()
- values_list()
- distinct()
- using()
1、reverse()
对 QuerySet 返回的结果进行反转,使用方法如下:
from blog.models import Blog
Blog.objects.filter(id__gte=2).reverse()
通过 reverse() 方法,可以使原本是某个顺序的数据顺序倒转返回。
2、values()
如果不使用 values() 方法,QuerySet 会返回 model 的所有字段,通过 obj.field_name 即可获取。
比如:
blog_obj = Blog.objects.all()[0]
blog_obj.name
如果我们在操作的时候仅仅想获取某一个或者某几个字段数据,则可以使用 values() 函数。
指定字段
如果是使用 values() 方法,则会仅仅返回相应字段的字典列表,比如:
name_dict_list = Blog.objects.values("name")
name_dict_list 数据则为:
<QuerySet [{'name': 'python3'}, {'name': 'hunter'}, {'name': 'a'}]>
name_dict_list 可以通过下标,访问到单条数据。
>>> name_dict_list[0]
{'name': 'python3'}
>>> name_dict_list[0].get('name')
'python3'
不指定字段
如果我们使用的时候不指定 values() 函数的参数,返回的则是该 model 所有字段的字典列表,比如说 Blog 这个 model 的字段为 id、name、tagline 三个,那么返回的是包含所有字段的字典列表,使用:
Blog.objecrs.filter(id=1).values()
返回的是:
<QuerySet [{'id': 1, 'name': 'hunter', 'tagline': 'asd'}]>
处理字段值返回
还可以对 values 指定的字段值进行处理后返回,比如全部都小写:
from django.db.models.functions import Lower
Blog.objects.values(lower_name=Lower('name'))
获取外键字段
也可以获取外键字段,指定外键加上双下划线和字段名即可:
Entry.objects.values('blog__name')
3、values_list()
values() 函数返回的结果是字典列表,列表里的元素是一个个的字典。
values_list() 函数返回的则是元组列表,效果如下:
Entry.objects.values_list('id', 'headline')
<QuerySet [(1, '123'), (2, 'wwwqeq')]>
如果我们需要获取的仅有一个字段,返回的也是一个元组列表,但是为了方便,我们也可以变成列表格式,加上 flat 参数即可。
注意: 这种情况仅存在于所需要获取的字段为一个的时候。
Entry.objects.values_list('id', flat=True)
<QuerySet [1, 2]>
这种方法比较好用,所以我常常在项目中使用。
4、distinct()
相当于 mysql 的 DISTINCT 的用法,这个用法需要用到前面介绍的 values() 方法。
使用方法如下:
Blog.objects.values("name").distinct()
5、using()
有时候,我们在 Django 项目中用到不止一个数据库,如果还用上了其他数据库,这些配置会在 settings.py 的 DATABASES 参数中配置。
比如:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db1',
"USER": "root",
"PASSWORD": "xxx",
"HOST": "192.168.10.100",
"PORT": 3306,
},
'other': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db2',
"USER": "root",
"PASSWORD": "xxx",
"HOST": "192.168.10.101",
"PORT": 3306,
}
}
那么如果我们要使用到 other 数据库的数据,则会用上 using()。
假设 TestModel 是属于 db2 数据库的,那么使用方法如下:
TestModel.objects.using('other').all()
其实我们一直使用的查询都是默认的指向 default 数据库的,所以就省略了 using() 用法,所以以下两种方法是等效的:
Blog.objects.all()
Blog.objects.using('default').all()
以上就是本篇笔记所有内容,接下来会介绍外键相关的 select_related、prefetch_related 等用法,它能够帮助我们在访问数据库的时候减少对数据库的访问次数。
本文首发于本人微信公众号:Django笔记。
原文链接:Django笔记十之指定字段取值及distinct去重处理
如果想获取更多相关文章,可扫码关注阅读:
Django笔记十之values_list指定字段取值及distinct去重处理的更多相关文章
- C# SQLiteDataReader获得数据库指定字段的值
获得数据库指定字段的值,赋给本地变量 (1)如下,获得userinfo数据表里的字段"userid"."orgid", string userid=" ...
- 把一个select查询结果插入到一个表(可选指定字段和值实例)
把一个select查询结果插入到一个表(可选指定字段和值实例) insert into bak (cc,yf) select cc,9 from ket insert into bak (cc,yf ...
- MySQL 自增字段取值
1 前言 本文来自回答思否网友的一个问题,这个网友新建了一张表,auto_increment_increment设为10,AUTO_INCREMENT主键起始值设为9, 当他插入数据的时候,发现主键值 ...
- Django笔记(2)Json字段处理
1) Django里面让Model用于JSON字段,添加一个JSONField自动类型如下: [python] view plain copy class JSONField(models.TextF ...
- 获取请求 header 中指定字段的值
private function getHeader($name) {//获取请求头中$name的值 $name = 'HTTP_' . $name; foreach ($_SERVER as $ke ...
- odoo开发笔记 -- tree视图按指定字段group_by分组显示
注意点: view视图文件中的搜索视图要放在action视图的前边. 在action视图中,要写search_view_id, 还有context, search_default_group_by_字 ...
- [转]Hibernate查询对象所有字段,单个字段 ,几个字段取值的问题
原文地址:http://www.ablanxue.com/prone_3552_1.html 1. 查询整个映射对象所有字段 Java代码 //直接from查询出来的是一个映射对象,即:查询整个映射对 ...
- Oracle批量更改所有表的字段取值_类型_原字段名
CREATE PROCEDURE 存储过程名称 is cursor c_tab is select * from user_tab_columns t r_tab user_tab_columns%r ...
- Entity Framwork(EF) 7——在Controller内获取指定字段的值
一.开发背景: 在用户登录的时候,验证用户和密码是否正确.验证通过后将用户名和用户ID保存下来以便后续数据更新时使用. 二.用户验证方法: 1.创建DBContext 对象. ApplicationD ...
- laravel 查询指定字段的值
$this->model->where('id',$id)->value('user');
随机推荐
- 关于ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x87\xA8\xF0\x9F...'报错的解决心得
昨天发现MySQL数据库执行发生了报错 ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x87\xA8\xF0\x9F...' 马上意识到应 ...
- 上分准备 VP Codeforces Round #762 (Div. 3) 4题ABCE
+00:02 +00:16 +01:08 +02:07 VP 情况 4/8 ABCE ,赛时排名可以到823,什么时候我可以上个青 B 本想写个map的二分的,发现自己不会,写了个普普通通的二分 ...
- css cursor: url() 使用火狐浏览器问题,鼠标没有效果
在火狐浏览器问题使用cursor: url():鼠标没有效果,需要给使用标签添加一个height
- ASP.NET Core 读取配置文件信息
一:读取配置文件 先来看一下appsettings.json文件的内容,如下图: { "ConnectionStrings": { "ServerConnection&q ...
- CF1272 B DIV3 ---代码对比
这次DIV3有点可惜啊,题解是我的与学长的代码对比 学长的原博客https://www.cnblogs.com/xyq0220/p/12036109.html B.Snow Walking Robot ...
- 测试--MD5--加密
CREATE TABLE `test`.`testmd5` ( `id` INT ( 4 ) NOT NULL, `name` VARCHAR ( 20 ) NOT NULL, `pwd` VARCH ...
- C语言中分治的思想-位运算
(1) 有101个整数,其中有50个数出现了两次,1个数出现了一次, 找出出现了一次的那个数. 位运算的思想:任何数和零异或得到自己,任何数自己异或得到0. eg1.{2,1,5,1,2,2} num ...
- SQL Server 启用“锁定内存页”
这次在虚拟机中做了一个模拟器做压力测试,简单模拟了一条20个工位的生产线上生产1000个工件,并向 MES 服务端发起功能请求,保存质量数据和扫码数据到数据库.在测试时发现服务端进程的 CPU 占用有 ...
- 转发 关于Windows安装解压版MySQL出现服务正在启动-服务无法启动的问题
部分转自 :https://blog.csdn.net/u013901768/article/details/80707307 我是从服务器上复制了mysql的整个目录,到本地,然后怎么也不好用,看了 ...
- 1004 Counting Leaves (30分)
今天在热心网友的督促下完成了第一道PAT编程题. 太久没有保持训练了,整个人都很懵. 解题方法: 1.读懂题意 2.分析重点 3.确定算法 4.代码实现 该题需要计算每层的叶子节点个数,所以选用BFS ...