Python Day74 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、双下划线单表查询

  具体介绍如下:

原文地址:https://www.cnblogs.com/liuduo/p/8001555.html