Login
芋圆社区 > 编程 > Django > values和values_list

values和values_list

327
0
2022-02-07
2022-10-13
Hey、小怪兽


values()


  • • values()得到的是一个字典形式的查询集(QuerySet),查询集是一个可迭代对象
  • • 官方文档例子说明:
  • # This list contains a Blog object.
    >>> Blog.objects.filter(name__startswith='Beatles')
    <QuerySet [<Blog: Beatles Blog>]>
    
    # This list contains a dictionary.
    >>> Blog.objects.filter(name__startswith='Beatles').values()
    <QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]>
  • • 如果指定字段,则每个字典将仅包含您指定的字段的字段键/值。如果您不指定字段,则每个字典将包含数据库表中每个字段的键和值。
  • >>> Blog.objects.values()
    <QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]>
    >>> Blog.objects.values('id', 'name')
    <QuerySet [{'id': 1, 'name': 'Beatles Blog'}]>
  • •​​​​​​​ values()方法还采用可选的关键字参数:
  • >>> from django.db.models.functions import Lower
    >>> Blog.objects.values(lower_name=Lower('name'))
    <QuerySet [{'lower_name': 'beatles blog'}]>
  • •​​​​​​​ 子句中的聚合values()应用于同一values()子句中的其他参数之前。如果您需要按另一个值分组,请将其添加到前面的values()子句中:
  • >>> from django.db.models import Count
    >>> Blog.objects.values('entry__authors', entries=Count('entry'))
    <QuerySet [{'entry__authors': 1, 'entries': 20}, {'entry__authors': 1, 'entries': 13}]>
    >>> Blog.objects.values('entry__authors').annotate(entries=Count('entry'))
    <QuerySet [{'entry__authors': 1, 'entries': 33}]>
  • •​​​​​​​ 这两个调用是一样的:
  • Blog.objects.values().order_by('id')
    Blog.objects.order_by('id').values()

values_list()


  • •​​​​​​​ values()返回是字典列表,而values_list()返回的是元组列表
  • •​​​​​​​ 这类似于values()除了返回字典之外,它在迭代时返回元组。每个元组都包含来自相应字段或传递给values_list()调用的表达式的值
  • >>> Entry.objects.values_list('id', 'headline')
    <QuerySet [(1, 'First entry'), ...]>
    >>> from django.db.models.functions import Lower
    >>> Entry.objects.values_list('id', Lower('headline'))
    <QuerySet [(1, 'first entry'), ...]>
  • •​​​​​​​ 如果只传入单个字段,也可以传入flat参数。如果True,这将意味着返回的结果是单个值,而不是一个元组
  • >>> Entry.objects.values_list('id').order_by('id')
    <QuerySet[(1,), (2,), (3,), ...]>
    
    >>> Entry.objects.values_list('id', flat=True).order_by('id')
    <QuerySet [1, 2, 3, ...]>
  • •​​​​​​​ flat当有多个字段时传入是错误的
  • •​​​​​​​ 一个常见的需求是获取某个模型实例的特定字段值。为此,请使用values_list()后跟get()调用:
  • >>> Entry.objects.values_list('headline', flat=True).get(pk=1)
    'First entry'

转为list或json


  • •​​​​​​​ values()和values_list()获取的值都是QuerySet
  • >>> blog = Blog.objects.values('id', 'name')
    <QuerySet [{'id': 1, 'name': 'Beatles Blog'}]>
  • •​​​​​​​ QuerySet转成list
  • blog_list = list(blog)
  • •​​​​​​​ list转成json
  • blog_json = json.dumps(blog_list)

上一篇:Django版本查看和升级

下一篇:过滤器linebreaksbr

Comment

Message Board

编程导航

Django使用Less

美化后台管理Admin

FBV 和 CBV

SimpleUI后台导航栏报错

Django多条件查询

标签属性使用变量引发的BUG

auto_now=True引发的问题

图片上传后大小问题

Django版本查看和升级

values和values_list

过滤器linebreaksbr

拆分views文件

AutoField报错

order_by多条件和随机排序

Django变量名的坑

Copyright © 2020 芋圆社区

Powered by 浙ICP备2020039309号-1

此页面不支持夜间模式!

已进入夜间模式!

已进入普通模式!

搜索框不允许为空

签到成功!经验+5!芋圆币+2!

签到失败!今日已签到!

需要登录社区账号才可以进入!

复制成功
寄,页面未加载完成或页面无锚点