Djiango后端开发入门学习之task03--QuerySet,Instance和APIView

  models.py本文根据datawhale开源Djiango后端开发入门( https://github.com/Joe-2002/sweettalk-django4.2 )Task01:搭建虚拟环境和项目以及构建数据表做的学习笔记。

一 QuerySet

1 QuerySet描述

从英文名字上不难理解:QuerySet就是存放数据库查询结果的集合。从数据库中查询结果存放的集合称为 QuerySet。 Django ORM用到三个类:Manager、QuerySet、Model。每个Model都有一个默认的manager实例,名为objects。Django的ORM通过Mode的objects属性提供各种数据操的接口(API),并通过 Model.objects 方法返回QuerySet,生产符合查询条件的列表。
(API英文全称为:Application Programming Interface,它是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。提供API所定义的功能的软件称作此API的实现。API是一种接口,故而是一种抽象。)
QuerySet描述如下:
class QuerySet(model=None, query=None, using=None)[source]
QuerySet类具有两个公有属性用于内省:
ordered:如果QuerySet是排好序的则为True,否则为False。
db:如果现在执行,则返回使用的数据库。
从数据库中查询结果存放的集合称为 QuerySet。

2 QuerySet操作

QuerySet 可实现数据ibao中数据的查询、修改和删除等操作。下面以QuerySey的带有条件查语句filter()进行其操作说明。由于其接口定义QuerySet ,用法类似,这里不再一一赘述,需要运用,可查阅Django官网。

2.1 filter()描述

(1)假定:已存在数据表定义如下:
class Goods(DjangoPeople):
{
number = CharField(max_length=32, verbose_name=‘编号’)
name = CharField(max_length=64, verbose_name=‘名称’)
unit = CharField(max_length=64, verbose_name=‘单位’)
remark = CharField(max_length=256, verbose_name=‘备注’)
} Person.objects.all() # 查询所有 语句。
(2) filter()(**kwargs)
将满足条件的数据提取出来,返回满足查询参数的对象集合。
1)取出name="x"的DjangoPeople成员:DjangoPeople.objects.filter(name=“abc”)

2)取出name="x"且unit="y"的DjangoPeople成员:
DjangoPeople.objects.filter(name=“x”) .filter(unit=“y”)

3、Queryset支持链式调用的接口说明

函数名 作用
filter() 将满足条件的结果返回,返回值为QuerySet对象
exclude() 将满足条件的结果过滤掉,返回值为QuerySet对象
annotate() 每一个对象都添加一个查询表达式,(Q,F,聚合函数)的字段
order_by() 对查询集进行排序,安装某个字段进行排序,默认为从小到大排序,如果想要重大到小可以在字段前加“-”,需要注意order_by可以传递多个参数,会按照先后级别进行排序,而且order_by还可以用annotate新增的字段来排序,注意:order_by重复调用会只会保存最后一个。
reverse() 把queryset中的结果倒序排列反向排序
distinct() 对查询集去重,用来进行去重查询
values() 返回包含对象具体值的字典的QuerySet,提取需要哪些字段,默认会把全部都提取出来。返回的结果是QuerySet,但是其中包裹的不是模型,而是字典,如果想要提取关联数据,那么可以通过F表达式来完成。values也可以使用聚合函数
values_list() 与values()类似,只是返回的是元组而不是字典。提取需要字段,返回QuerySet,其中包裹的元组,如果数据只有一条,则可以使用flat=True进行扁平化处理,直接返回结果
dates() 根据日期获取查询集
datetimes() 根据时间获取查询集
none() 创建空的查询集,返回空的查询集
all() 获取所有的对象,返回全部数据(返回包裹对象的QuerySet)
select_related() 附带查询关联对象,可以将关联的对象一起查询出来,只能用于外键连接的形式(一对多或者一对一的形式)
extra() 附加SQL查询
prefetch_related() 预先查询, 使用的时候传入反向引用的时候调用的名称默认为 filed_set,使用这个方式可以用来查询多对一或者多对多的方式,也可以用来查询一对一或者一对多的,但是不推荐。
defer() 不加载指定字段,过滤掉不需要的字段,返回值是一个包裹着模型的QuerySet
only() 只加载指定的字段,提取某些字段,返回一个包裹模型的QuerySet
using() 选择数据库
select_for_update() 锁住选择的对象,直到事务结束。
raw() 接收一个原始的SQL查询
get 直接返回对象,只能返回一条数据,如果返回数据超过一条就会报错,如果没有匹配到任何数据也会报错。
create 用于增加一条数据,并且将数据保存在数据库中,相当于先创建数据,然后调用save方法
get_or_create 如果给定的条件存在数据就查找返回,如果不存在就创建一个,然后在返回,返回结果是一个元组,元组中两个内容,第一个是模型对象,第二个是bool值,如果没有创建返回False,如果创建了返还True。
bulk_create 可以一次性创建多条数据
count 获取满足条件的数据的个数
first,last 分别返回QuerySet中第一条和最后一条数据
exists 判断数据是否存在,存在返回True,不存在返回False
distinct 去重,默认按照全部字段判断。注意如果和order_by同时使用会失效
update 更新数据
delete 删除数据,需要注意:字段中on_delete的级联删除方式

4 两大特点

(1) 惰性:若这个对象中包含了需要的数据且需要使用时,它会去DB中获取数据,否则不会获取。 比如说在内部,创建、过滤、切片和传递一个QuerySet,而没有进行真正的数据执行,不会真实操作数据库,被称为惰性。
(2)缓存
使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。

二 Instance

Instance指的是一个 Django 模型的单个实例,也就是数据库中的一行数据。相比于 QuerySet(查询集合),它是针对单个对象的操作,用于创建、更新或者删除单个模型实例。
创建一个对象:Obj = Model(attr1=val1, attr2=val2),Obj.save()
更新一个对象:Obj = Model.objects.get(id=xxx),Obj.attr1 = val1,Obj.save()
删除一个对象:Obj = Model.objects.get(id=xxx),Obj.delete()
Difference

三 APIview

View是Django默认的视图基类,APIView是REST framework提供的所有视图的基类, 继承自Django的View。APIview 是 Django REST Framework 提供的一个视图类。它和 Django 中的 view 类有些相似,但是又有一些不同之处。APIview 可以处理基于 HTTP 协议的请求,并返回基于内容协商的响应,它旨在提供一个易于使用且灵活的方式来构建 API 视图。所以,是的APIview应用得以实现,需要有以下三个部分:
(1)models.py里创建的数据表。models.py功能函数在Djiango后端开发入门学习之task02博客中做了专门描述。
(2)view.py里编查询QuerySet数据查询处理功能的程序代码。(这是这篇博客主要讲述,待补充的内容)
(3)并通过urls.py实现和网页的链接。urls.py又称为URL分发器(路由配置文件)。开发者通过URL配置构建Django所关联的网站目录,从而通知Django,对于不同的URL调用不同的view.py中编写的程序代码。,而那个URL调用那段代码。URL加载是从配置文件中开始的。
待补充完善…

你可能感兴趣的:(学习,数据库)