python之路_django ORM模型(单表)(二)
一、查询表记录
1、查询相关API
现将主要的查询API使用实例介绍如下,其中Student为定义的表类:
(1).Student.objects.all() #返回的QuerySet类型 查询所有记录 [obj1,obj2....] (2).Student.objects.filter() #返回的QuerySet类型 查询所有符合条件的记录 (3).Student.objects.exclude() #返回的QuerySet类型 查询所有不符合条件的记录,过滤条件之外的 (4).Student.objects.get() #返回的models对象 查询结果必须有且只有一个,否则报错 (5).Student.objects.all().first() #返回的models对象 查询结果集合中的第一个,默认是按照主键进行排序的 (6).Student.objects.filter().last() #返回的models对象 查询结果集合中的最后一个,默认是按照主键进行排序的 (7).Student.objects.all().values("name","class_id") #返回的QuerySet类型 ,列表中存放的字典 (8).Student.objects.all().values_list("name","class_id") #返回的QuerySet类型 ,列表中存放的元组 (9).Student.objects.all().order_by("class_id") #按指定字段排序,不指定,按主键排序 (10).Student.objects.all().count() #返回的记录个数 (11).Student.objects.all().values("name").distinct() #返回记录进行去重 (12).Student.objects.all().exist() #查询结果是否存在,返回True或者False
filter():
如下例,查询结果为queryset类型,括号内为过滤条件,多个条件为且的关系。
stu_list=Student.objects.filter(name="龙华",class_id=6)
exclude():
如下例,查询结果为queryset类型,结果为除括号内过滤条件之外的数据。
stu_list=Student.objects.exclude(name="alex")
first():
如下例,查询结果为models类型,是按照主键排序的方式的第一个结果。
#stu_obj=Student.objects.all().first() stu_obj=Student.objects.filter(birth__year="2017").first() print(stu_obj.name)
order_by():
如下例,查询结果为queryset类型,对查询结果进行排序。
stu_list=Student.objects.all().order_by("-class_id") #降序排列 stu_list=Student.objects.all().order_by("-class_id") #升序排列
values()与value_list()区别:
ret=Book.objects.values_list("title") #values_list("title")前即可加all()也可以加filter() print(ret) #<QuerySet [('王子与青蛙',), ('公主的记忆',), ('爱与恨',)]> ret=Book.objects.values("title") #values"title")前即可加all()也可以加filter() print(ret) #<QuerySet [{'title': '王子与青蛙'}, {'title': '公主的记忆'}, {'title': '爱与恨'}]>
get():
过滤条件指向的数据必须有且只有一个记录,否则报错,结果为model类型。
ret=Student.objects.get(class_id="5") print(ret.name)
exist():
当确实有数据存在的时候,如下两种方式均可以执行if语句,但是从执行时翻译成的sql语句,我们就可看出exist存在的意义,他只会查询一条记录,这对数据量很大的表,查询效率是很高的。
#方式一: stu_list=Student.objects.all().exists() #翻译的sql语句:SELECT (1) AS "a" FROM "app01_student" LIMIT 1; args=() if stu_list: print("OK") #方式二: stu_list=Student.objects.all() #翻译的sql语句:SELECT "app01_student"."tid", "app01_student"."name", "app01_student"."birth", "app01_student"."age" FROM "app01_student"; if stu_list: print("OK")
2、双下划线单表查询
具体介绍如下: