从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet

  • 1. 查看Django QuerySet执行的SQL

.query.__str__()或 .query属性打印执行的sql语句

from quicktool.models import User
from django.http import HttpResponse
Creat = User.objects.all().filter(created=1557222940).query.__str__()
return HttpResponse(str(Creat))
#输出结果:SELECT `user`.`表字段1`, `user`.`表所有字段`, FROM `user` WHERE `user`.`created` = 1557222940
  • 2. Django manage.py 提供shell模式

进入Django的manage.py所在目录执行 python manage.py shell 进入shell模式

C:\Users\admin>d:
D:\>cd D:\django_test\mytestsite
D:\django_test\mytestsite>python manage.py shell
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

  

  • 3. values()返回字典和values_list()返回元组

* 3.1 普通的模型对象

普通的模型对象---用shell模式打印结果

>>> from quicktool.models import User
>>> TodayCreat = User.objects.filter(created=1488356162)
>>> print(type(TodayCreat))
<class 'django.db.models.query.QuerySet'>
>>> print(TodayCreat)
<QuerySet [<User: User object (63)>]>

普通的模型对象---用视图网址展示结果

from quicktool.models import User
from django.http import HttpResponse
def TodayCreat(request):
TodayCreat = User.objects.filter(created=1488356162)
return HttpResponse(TodayCreat)
# 浏览器展示结果:User object (63)

  

* 3.2 values()

values()返回一个ValuesQuerySet(QuerySet的一个子类),迭代时返回字典,而不是模型实例对象
每个字典表示一个对象,键对应于模型对象的属性名称

>>> from quicktool.models import User
>>> TodayCreat = User.objects.filter(created=1488356162).values()
>>> print(type(TodayCreat))
<class 'django.db.models.query.QuerySet'>
>>> print(TodayCreat)
<QuerySet [{'id':63, 'name':'xili','sex':'男'}]>

values()返回字典---用视图网址展示结果

from quicktool.models import User
from django.http import HttpResponse
def TodayCreat(request):
TodayCreat = User.objects.filter(created=1488356162).values()
return HttpResponse(TodayCreat)
# 浏览器展示结果:{'id':63, 'name':'xili','sex':'男'}

values(*fields),指定过滤哪些字段,返回的字典将只包含指定的字段的键和值

如果没有指定字段,返回的每个字典将包含数据表中所有字段的键和值

>>> from quicktool.models import User
>>> TodayCreat = User.objects.filter(created=1488356162).values('id','name')
>>> print(type(TodayCreat))
<class 'django.db.models.query.QuerySet'>
>>> print(TodayCreat)
<QuerySet [{'id': 63, 'name': 'xili'}]>

values(*fields)返回字典---用视图网址展示结果

from quicktool.models import User
from django.http import HttpResponse
def TodayCreat(request):
TodayCreat = User.objects.filter(created=1488356162).values('id','name')
return HttpResponse(TodayCreat)
# 浏览器展示结果:{'id':63, 'name':'xili'}

  

* 3.3 values_list()

values_list()迭代时返回元组,而不是字典

>>> from quicktool.models import User
>>> TodayCreat = User.objects.filter(created=1488356162).values_list()
>>> print(type(TodayCreat))
<class 'django.db.models.query.QuerySet'>
>>> print(TodayCreat)
<QuerySet [(63, 'xili','男')]>

values_list()返回元组---用视图网址展示结果

from quicktool.models import User
from django.http import HttpResponse
def TodayCreat(request):
TodayCreat = User.objects.filter(created=1488356162).values()
return HttpResponse(TodayCreat)
# 浏览器展示结果:(63,'xili','男')

values_list(*fields),指定过滤哪些字段,返回的元组将只包含指定的字段的键和值

如果没有指定字段,返回的每个元组将包含数据表中所有字段的键和值

>>> from quicktool.models import User
>>> TodayCreat = User.objects.filter(created=1488356162).values_list('id','name')
>>> print(type(TodayCreat))
<class 'django.db.models.query.QuerySet'>
>>> print(TodayCreat)
<QuerySet [(63, 'xili')]>

values_list(*fields)传字段参数,不传flat参数,返回元组---用视图网址展示结果

from quicktool.models import User
from django.http import HttpResponse
def TodayCreat(request):
TodayCreat = User.objects.filter(created=1488356162).values('id','name')
return HttpResponse(TodayCreat)
# 浏览器展示结果:(63,'xili')

values_list(*fields),*fields如果只传递一个字段,则可以传递flat参数为True,它表示返回的结果为单个值,而不是元组。

>>> from quicktool.models import User
>>> TodayCreat = User.objects.filter(created=1488356162).values_list('name',flat=True)
>>> print(type(TodayCreat))
<class 'django.db.models.query.QuerySet'>
>>> print(TodayCreat)
<QuerySet ['xili']>

values_list(*fields)既传字段参数又传flat参数,返回元组---用视图网址展示结果

from quicktool.models import User
from django.http import HttpResponse
def TodayCreat(request):
TodayCreat = User.objects.filter(created=1488356162).values('name',flat=True)
return HttpResponse(TodayCreat)
# 浏览器展示结果:xili

注:values_list(*fields),*fields如果传递了多个字段,再传递flat则会报错

TypeError: 'flat' is not valid when values_list is called with more than one field.

>values和values_list返回结果类型上的差别:

* vlaues -

单条记录 - <class 'dict'>

多条记录 - <class 'django.db.models.query.QuerySet'>

* vlaues_list -

单条记录 - <class 'tuple'>

多条记录 - <class 'django.db.models.query.QuerySet'>

  • 4. 获取对象的方法
# all():查询所有结果
Person.objects.all() # 查询所有的Person条目
Person.objects.all()[:10] #切片操作,获取10个人,不支持负索引,切片可以节约内存,不支持负索引 # get(**kwargs):返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误
Person.objects.get(name="xili") # 名称为 xili的一条,多条会报错 # filter(**kwargs):返回与所给筛选条件相匹配的对象
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
Person.objects.filter(name__regex="^abc") # 正则表达式查询
Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
Person.objects .filter(creat__gt=1488356162) # creat时间大于某个时间戳
Person.objects .filter(creat__gte=1488356162) # creat时间大于等于某个时间戳
Person.objects .filter(creat__lt=1488356162) # creat时间小于某个时间戳
Person.objects .filter(creat__lte=1488356162) # creat时间小于等于某个时间戳
Person.objects .filter(creat__range=(start_time, end_time)) # creat时间在start_time和end_time范围内 # exclude(**kwargs):返回与所给筛选条件不匹配的对象
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的

  

  • 5. order_by():查询结果排序,升序或降序
# order_by('-id')倒序,order_by('id')升序
# 元组升降序
User.objects.filter(Class_id=5).values_list('id').order_by('-id')
打印结果:(167,)(158,)(144,)(142,)(141,)(140,)(139,)(138,)(137,)(136,)(135,)(118,)(68,)
User.objects.filter(Class_id=5).values_list('id').order_by('id')
打印结果:(68,)(118,)(135,)(136,)(137,)(138,)(139,)(140,)(141,)(142,)(144,)(158,)(167,)
# 字典也能升降序
User.objects.filter(Class_id=5).values('id').order_by('id')
打印结果:{'id': 68}{'id': 118}{'id': 135}{'id': 136}{'id': 137}{'id': 138}{'id': 139}{'id': 140}{'id': 141}{'id': 142}{'id': 144}{'id': 158}{'id': 167}
  • 6. QuerySet 不支持负索引,①reverse():对查询结果反向排序 ②order_by():降序
Person.objects.all()[:10] #切片操作,前10条
Person.objects.all()[-10:] #会报错!提示Negative indexing is not supported. # 1. 使用 reverse() 解决
Person.objects.all().reverse()[:2] # 最后两条
Person.objects.all().reverse()[0] # 最后一条 # 2. 使用 order_by() 解决
Author.objects.order_by('-id')[:20] # id最大的20条
  • 7. QuerySet 支持链式查询
Plan.objects.all().filter(status=3).filter(created__lte=1557331200).filter(finished__gte=1557417599)
User.objects.all().values('created').annotate(count=Count('created')).values('created','count')
Person.objects.filter(name__contains="abc").exclude(age=23)
  • 8. 去重

① distinct():从返回结果中剔除重复纪录

qs1 = Pathway.objects.filter(label__name='x')
qs2 = Pathway.objects.filter(reaction__name='A + B >> C')
qs3 = Pathway.objects.filter(inputer__name='xili') # 合并到一起
qs = qs1 | qs2 | qs3
这个时候就有可能出现重复的 # 去重方法
qs = qs.distinct()

② set():python内置函数,创建一个无序不重复的集合

select_UserID = Pathway.objects.filter(inputer__name='xili')
set(select_UserID)

 

  • 9. list(): 强行将QuerySet变为列表
select_UserID = Pathway.objects.filter(inputer__name='xili')
list(select_UserID)
#结果打印[(532,), (671,), (797,), (532,)]
#原先未转变前打印((532,), (671,), (797,), (532,))

  

  • 10. 统计数量

① count():返回数据库中匹配查询(QuerySet)的对象数量

User.objects.all().filter(created__range=(today_start_time, today_end_time)).count()

② len():将元组、字典或list统计元素个数

select_UserID = Pathway.objects.filter(inputer__name='xili')
len(select_UserID)

  

  • 11. first(): 返回第一条记录;last(): 返回最后一条记录
Pathway.objects.filter(inputer__name='xili').first()
Pathway.objects.filter(inputer__name='xili').last()

  

  • 12. exists(): 如果QuerySet包含数据,就返回True,否则返回False
from quicktool.models import User
from django.http import HttpResponse
TodayCreat = User.objects.all().filter(created__range=(today_start_time, today_end_time)).exists()
return HttpResponse(count_TodayCreat)
#能查询出数据则结果为True,不能查询出数据则返回False
  • 13. QuerySet 是可迭代的
es = Entry.objects.all()
for e in es:
print(e.headline)

Django models 单表查询的更多相关文章

  1. Django之单表查询——神奇的双下划线

    1.filter中的单表查询 # 查询id>1且id<4的结果 ret = models.Person.objects.filter(id__gt=1,id__lt=4) print(re ...

  2. django之单表查询

    一.创建表 1.创建模型: 创建名为book的app,在book下的models.py中创建模型: from django.db import models # Create your models ...

  3. Django ORM单表查询必会13条

    必知必会13条 操作下面的操作之前,我们实现创建好了数据表,这里主要演示下面的操作,不再细讲创建准备过程 <1> all(): 查询所有结果 <2> filter(**kwar ...

  4. 65、django之模型层(model)--添加、单表查询、修改基础

    上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...

  5. django之数据库表的单表查询

    一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name ="海东",cou ...

  6. django之模型层(model)--添加、单表查询、修改基础

    上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...

  7. Django ORM 操作 必知必会13条 单表查询

    ORM 操作 必知必会13条 import os # if __name__ == '__main__': # 当前文件下执行 os.environ.setdefault('DJANGO_SETTIN ...

  8. Django框架----数据库表的单表查询

    一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name ="海东",cou ...

  9. 54 Django 模型层(1) 单表查询

    单表操作: 一 项目的操作顺序: 1 在model.py文件中创建表结构 class Book(models.Model): id=models.AutoField(primary_key=True) ...

随机推荐

  1. [b0007] windows 下 eclipse 开发 hdfs程序样例

    目的: 学习使用hdfs 的java命令操作 相关: 进化: [b0010] windows 下 eclipse 开发 hdfs程序样例 (二) [b0011] windows 下 eclipse 开 ...

  2. 苹果手机Chrome浏览器显示input:disabled时字体颜色总是为浅灰色

    今天被测试人员提了个bug:苹果手机浏览器(Chrome)打开h5,控件在input:disabled的样式始终是浅灰色,要求改成黑色.测试对比:1.在多个pc浏览器上浏览input:disabled ...

  3. VMware workstation安装centos7,无ifconfig命令

    一.centos7默认未启动ifconfig,vi /etc/sysconfig/network-scripts/ifcfg-ens33,改成ONBOOT=yes: systemctl restart ...

  4. luoguP5094 [USACO04OPEN]MooFest 狂欢节

    get 到的 这种需要求 含 max 的式子,枚举最大值的方法非常普遍. 类似的,还有含 min , gcd 的式子,枚举他们也很普遍 主要难点 我们首先想到,先按 v 从小到大排序,因为这样既可以简 ...

  5. 工具资源系列之给 windows 虚拟机装个 windows

    前面我们已经介绍了如何在 Windows 宿主机安装 VMware 虚拟机,这节我们将利用安装好的 VMware 软件安装 Windows 系统. 前情回顾 虚拟机是相对于真实的物理机而言的概念,是在 ...

  6. 怎样用cmd脚本添加Qt的环境变量

    在网上遍历了很久,终于找到了一个简单且令人满意的答案: 定位到PyQt5发布文件所需的plugins的位置: 新建一个名为“设置环境变量”的cmd脚本,在里面写上: wmic ENVIRONMENT ...

  7. 插头Dp总结

    T1 HDU1693:Eat the Trees 题目大意:给出n*m的方格,有些格子不能铺线,其它格子必须铺,可以形成多个闭合回路.问有多少种铺法? 插头Dp板子题,题目要求可以是多个回路, 只需要 ...

  8. [NewLife.XCode]角色权限

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...

  9. java 常见高级开发面试题 非算法等特定岗 一

    基础1.List和Set区别 List:1.可以允许重复的对象. 2.可以插入多个null元素. 3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序. 4.常用的实现类有 Arra ...

  10. Windows编译运行webrtc全过程

    年纪大了,不想写什么开头.摘要,咱直接开始吧. 不过首先还是要感谢声网提供的webrtc国内源码镜像. 首先,编译webrtc你需要一台win10,而且必须得是一直在更新版本的.因为编译过程需要用到c ...