百木园-与人分享,
就是让自己快乐。

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

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

本篇笔记目录如下:

  1. reverse()
  2. values()
  3. values_list()
  4. distinct()
  5. 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去重处理

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


来源:https://www.cnblogs.com/hunterxiong/p/17266552.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » Django笔记十之values_list指定字段取值及distinct去重处理

相关推荐

  • 暂无文章