前言
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()