前言
django查询数据库的方法很多,不同的方法返回的结果也不太一样,本篇详细讲解关于查询的13个方法
- 返回对象是对象列表的:all(),filter(),exclude(),order_by(),reverse(),values(),values_list(),distinct()
- 返回结果是对象:get(),first(),last()
- 返回结果是布尔值:exists()
- 返回数字:count()
数据准备
接着前面的User表,测试数据如下
可迭代对象queryset
查询整张表sql:select * from xjyn_users
django里面查询数据库不需要写sql语句 r=表的类名称.objects.all() 返回的是整个表的内容,这里返回的是可迭代对象queryset,并没有直接返回全部数据
如果想取出数据,需要用到for循环读取;
testdb.py内容如下;
#testdb.py
from django.http import HttpResponse
from xjyn.models import Users
def sel_all(request):
names=""
pwds=""
mails=""
r=Users.objects.all()
for i in r:
names+=" "+i.user_name
pwds+=" "+i.pwd
mails+=" "+i.mail
return HttpResponse('''<p>查询username结果:{},
<p>查询pwd结果:{},
<p>查询mail结果:{}
'''.format(names,pwds,mails))
urls.py内容如下;
#helloworld/helloworld/urls.py
from django.conf.urls import url
from . import testdb
urlpatterns=[
url('^$',testdb.sel_all),
]
浏览器访问:http://127.0.0.1:8000/,结果如下:
筛选条件filter()
查询的时候添加删除条件,类似于SQL里面的where语句
select * from xjyn_users where user_name="hui6" and pwd="333"
filter()查询的结果是可迭代对象,如果结果只有一个,可以通过下标取值。找不到的时候给个默认值null
testdb.py中新增内容如下;
def sel_filter(request):
r=""
result=Users.objects.filter(user_name="hui6",
pwd="333")
try:
r=result[0].mail
except:
r="null"
return HttpResponse("<p>查询mail结果:{}</p>".format(r))
在urls.py配置访问地址
url('^selectf$',testdb.sel_filter),访问后得到的结果:查询mail结果:123456@qq.com
可迭代的字典序列values()
all()和filter()返回的都是可迭代的queryset序列,平常我们习惯取字典的对象,可以用values()方法获取Users.objects.all().values("user_name","mail")类似于SQL语句
select user_name,pwd from xjyn_users
testdb.py中新增内容:
def sel_values(request):
r=""
result=Users.objects.all().values("user_name","mail")
for i in result:
r+=str(i)
return HttpResponse('<p>查询结果:{}</p>'.format(r))
在urls.py配置访问地址
url('^sel_v$',testdb.sel_values),访问后得到的结果:
查询结果:{'user_name': 'hui6', 'mail': '123456@qq.com'}{'user_name': 'he', 'mail': '3'}{'user_name': 'gun', 'mail': '7'}
其它可迭代对象
- exclude() 它包含了与所给筛选条件不匹配的对象 调用者:objects管理器 返回queryset
查找用户名不是"hui6"的数据
et=Users.objects.exclude(user_name="hui6")
- order_by() 对查询结果排序 由queryset对象调用,返回值是queryset
查询所有的数据,按mail字段排序,默认升序
result=Users.Objects.all().order_by("mail")
查询所有的数据,按mail字段排序,前面加个-是代表降序
result=Users.Objects.all().order_by("-mail")
如果有“-”则代表降序,没有则默认升序
- reverse()对查询结果反向排序 由queryset对象调用,返回值是queryset
查询所有的数据,按mail字段排序,默认升序,查询结果反向排序,功能跟-mail一样
result=Users.objects.all().order_by("mail").reverse()
- values_list()由queryset对象调用,返回值是queryset一个元组序列
和values差不多,只是这里返回的是元组
result=Users.objects.all().values_list("user_name","mail")
- distinct() 从返回结果中剔除重复记录 由queryset对象调用,返回值是queryset
和sql里面的distinct去重一样
result=Users.objects.all().values("user_name","mail").distinct()
get()返回单个对象
django的get是从数据库里取得唯一一个匹配的结果,返回一个对象。调用中:objects管理器 返回查询到model对象(注意:查询结果有且只有一个才执行)
如果查询结果右多个,会报错MultipleObjectsReturned,如果查询结果有0个,会报错DoseNotExist
def sel_get(request):
r=""
re=Users.objects.get(mail="7")
r=re.user_name+re.pwd
return HttpResponse('<p>查询结果:{}</p>'.format(r))
在urls.py配置访问地址 url('^selget$',testdb.sel_get),访问后得到的结果:查询结果:gun111
first() 和last()
first(),last()方法:返回第一条记录和返回最后一条记录 调用者:queryset 返回model对象
def sel_first(request):
rs=Users.objects.all().order_by("pwd")[0].mail
re=Users.objects.all().order_by("pwd").first()
r=re.mail
rel = Users.objects.all().order_by("pwd").last()
rl = rel.mail
return HttpResponse('查询rs结果:{},first结果:{},last结果:{}'.format(rs,r,rl))
在urls.py中配置访问地址
url('^self$',testdb.sel_first),访问结果如下图
exists()和count()
exists() 如果QuerySet包含数据,就返回True,否则返回False 由queryset对象调用 返回值布尔值
exists:由queryset对象调用 返回值布尔值
is_exist=Users.objects.all().exists()
count:数数 由queryset对象调用 返回int
count:数数 ;由queryset对象调用,返回int
ret=Users.objects.all().count()