翼度科技»论坛 编程开发 python 查看内容

Django笔记十之values_list指定字段取值及distinct去重处理

2

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
这篇笔记将介绍 reverse、distinct、values 和 values_list 的用法。
本篇笔记目录如下:

  • reverse()
  • values()
  • values_list()
  • distinct()
  • 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. [/code]name_dict_list 可以通过下标,访问到单条数据。
  2. [code]>>> name_dict_list[0]
  3. {'name': 'python3'}
  4. >>> name_dict_list[0].get('name')
  5. 'python3'
复制代码
不指定字段
如果我们使用的时候不指定 values() 函数的参数,返回的则是该 model 所有字段的字典列表,比如说 Blog 这个 model 的字段为 id、name、tagline 三个,那么返回的是包含所有字段的字典列表,使用:
  1. Blog.objecrs.filter(id=1).values()
复制代码
返回的是:
  1. [/code][b]处理字段值返回[/b]
  2. 还可以对 values 指定的字段值进行处理后返回,比如全部都小写:
  3. [code]from django.db.models.functions import Lower
  4. 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去重处理
如果想获取更多相关文章,可扫码关注阅读:


来源:https://www.cnblogs.com/hunterxiong/p/17266552.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具