Django models 单表查询
从数据库中查询出来的结果一般是一个集合,这个集合叫做 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 单表查询的更多相关文章
- Django之单表查询——神奇的双下划线
1.filter中的单表查询 # 查询id>1且id<4的结果 ret = models.Person.objects.filter(id__gt=1,id__lt=4) print(re ...
- django之单表查询
一.创建表 1.创建模型: 创建名为book的app,在book下的models.py中创建模型: from django.db import models # Create your models ...
- Django ORM单表查询必会13条
必知必会13条 操作下面的操作之前,我们实现创建好了数据表,这里主要演示下面的操作,不再细讲创建准备过程 <1> all(): 查询所有结果 <2> filter(**kwar ...
- 65、django之模型层(model)--添加、单表查询、修改基础
上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...
- django之数据库表的单表查询
一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name ="海东",cou ...
- django之模型层(model)--添加、单表查询、修改基础
上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...
- Django ORM 操作 必知必会13条 单表查询
ORM 操作 必知必会13条 import os # if __name__ == '__main__': # 当前文件下执行 os.environ.setdefault('DJANGO_SETTIN ...
- Django框架----数据库表的单表查询
一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name ="海东",cou ...
- 54 Django 模型层(1) 单表查询
单表操作: 一 项目的操作顺序: 1 在model.py文件中创建表结构 class Book(models.Model): id=models.AutoField(primary_key=True) ...
随机推荐
- ansible错误ImportError: No module named ansible.runner记录
按着官网提供的安装ansible To configure the PPA on your machine and install ansible run these commands: $ sudo ...
- 【CobaltStrike】对CobaltStrike内置功能模块的了解
对CobaltStrike内置功能模块的了解 0x00 右键功能列表 Interact 打开beacon Access dump hashes 获取hash Elevate 提权 Golden Tic ...
- 2、mongoDB的基本操作
数据写入和查询: show dbs (查看有哪些数据库) use imooc (使用数据库) db.dropDatabase() 删除数据库 备注:在use的时候如果use一个不存在的表,在mongo ...
- nginx典型官方模块解释
模块名称 作用 语法 默认 配置位置 配置举例 结果验证 备注 1 --with-http_stub_status_module 监控Nginx的服务器连接状态 stub_status serve ...
- day66_10_10,vue项目环境搭建
一.下载. 首先去官网查看网址. 下载vue环境之前需要先下载node,使用应用商城npm下载,可以将其下载源改成cnpm: """ node ~~ python:nod ...
- hdu6494 dp
http://acm.hdu.edu.cn/showproblem.php?pid=6494 题意 一个长n字符串(n,1e4),'A'代表A得分,'B'代表B得分,'?'代表不确定,一局比赛先得11 ...
- P2P中的NAT穿越(打洞)方案详解
一.P2P(点对点技术) 点对点技术(peer-to-peer,简称P2P)又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上. 点对点技 ...
- 三大相关系数: pearson, spearman, kendall(python示例实现)
三大相关系数:pearson, spearman, kendall 统计学中的三大相关性系数:pearson, spearman, kendall,他们反应的都是两个变量之间变化趋势的方向以及程度,其 ...
- k8s云集群混搭模式落地分享
在 <k8s云集群混搭模式,可能帮你节省50%以上的服务成本>一文中,介绍了使用k8s + 虚拟节点混合集群的方式,为负载具有时间段波峰.波谷交替规律的业务节约成本,提高服务伸缩效率的部署 ...
- JVM-基本操作
1.我们为什么要对jvm做优化?在本地开发环境中我们很少会遇到需要对jvm进行优化的需求,但是到了生产环境,我们可能将有下面的需求: 运行的应用“卡住了”,日志不输出,程序没有反应服务器的CPU负载突 ...