这篇笔记将介绍 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 笔记十之取值指定字段及去重
如果想获取更多相干文章,可扫码关注浏览: