P08 QuerySet 和 Instance

QuerySet

Django 的 ORM(Object-Relational Mapping,对象-关系映射)是一个非常强大的工具,它帮助你管理和查询数据库。ORM 能够让你使用Python(或其他编程语言)来操作数据库,就像你在操作Python对象一样。ORM用到三个类:Manager、QuerySet、Model。

从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet。

Django的ORM通过Model的objects属性提供各种数据操的接口(API),并通过 Model.objects 方法返回QuerySet,生产符合查询条件的列表,列表中包含多个 Instance。

QuerySet 的正式定义

class QuerySet(model=None, query=None, using=None)[source]

QuerySet 的两大特色

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

QuerySet 的 API 方法

  • all() :返回模型的所有对象

  • filter()(**kwargs) 用于返回符合条件的所有数据

  • get() 方法与 filter() 的作用类似,用于返回符合条件的单个对象但是可能会返回多个值

  • delete() :可以删除符合条件的所有对象

  • update() :将符合条件的所有对象的某个字段值进行更新

  • create()save() 方法的快捷方式,用于创建并保存一个新的对象

  • count() :返回符合条件的对象数量

  • order_by() :对返回的对象进行排序,默认为升序。降序则在字段名前面加负号

  • values():用来指定提取的数据中需要提取哪些字段

调用方法是:模型名.objects.方法名

比如views.py中的代码示例

Instance

Instance指的是一个 Django 模型的单个实例,也就是数据库中的一行数据。相比于 QuerySet(查询集合),它是针对单个对象的操作,用于创建、更新或者删除单个模型实例。

QuerySet 适用于需要查找多个对象或进行聚合操作的场景,而 Instance 适用于单独对象的创建、修改和删除操作。

创建一个对象

更新一个对象

删除一个对象

操作演示

打开shell

我们使用 shell 来熟悉 QuerySet 和 Instance 的操作

ctrl + `

打开 vscode 终端,执行进入 erp 目录,打开 shell

导入 models.py 中的2个类

models.py 中有2个类

GoodsCategory 和 Goods

QuerySet 和 Instance 演示

QuerySet 示例

all() :返回全部对象

这里分别显示了GoodsCategoryGoods的全部对象

values():显示更详细信息

可以看出GoodsCategory包含idnameremark 3个特征

Goods包含idcategory_idnumbernamebarcodespecshelf_life_dayspurchase_priceretail_priceremark 10个特征

只显示numbernameretail_price 3个特征

count():计算对象数目

可以看出GoodsCategory包含7个对象,Goods包含4个对象

同时QuerySet的结果可以赋给变量,进行后续操作

filter():筛选符合条件的对象

返回remark=None的对象

返回number > 2的对象

返回 number > 1 以及 retail_price < 150 的对象,即 filter 可以多个条件联合使用

exclude():排除符合条件的对象

去除remark=None的对象,即筛选出remark != None的对象

update():修改数据并保存

GoodsCategoryid=13的对象的 remark 改成眼镜

delete():删除对象

删除name="动物"的对象

order_by():对筛选结果排序

将Goods的numbernameretail_price 3个特征 按照retail_price进行升序排列

通过添加负号,将 Goods 按照降序排列

Instance示例

get():指定一个对象

返回name="苹果"的对象

修改一个对象

delete():删除一个对象

删除GoodsCategoryid=2的对象,即name="茶壶"的对象

最后更新于