Django——ORM增删改查

基本对象

model.objects

创建数据

可以通过django编写的命令行方式快捷创建数据

python manage.py shell

如果对模型层有任何修改都需要重启shell,否则操作容易出错

在shell中我们需要先引入我们的模型,如from bookstore.models import Book

然后通过以下代码创建一条条数据

python 复制代码
# 方法一
book1 = Book.objects.create(title='python',pub='unknown',price=20)

# 此时数据库中就已经有了这样一条数据

#方法二
book2 = Book(title='python',pub='unknown',price=20)

book2.save() # 至此才成功创建book2的数据

查询操作

python 复制代码
# django中 我们每个模型类都对应一个objects属性
# 通过调用该属性可获得该模型的相关操作

# 假设我们已有Book类

# 相当于select * from book;
books = Book.objects.all()

调用的先后顺序不重要,django会自动帮我们按sql逻辑叠加条件执行

返回的对象均为Queryset,这一类对象还可以继续调用django编写的这些方法

如果查询结果为空,返回的就是一个空的Queryset对象

复杂问题情境:现需要查询价格高于20或出版社为清华大学出版社的书

  • 这里需要介绍django中的Q对象

from django.db.models import Q

Books.objects.fillter(Q(price__gt=20)|Q(pub="清华大学出版社"))

Q对象可以支持或(|)非(~)等复杂逻辑操作,只需要在每个条件外包裹Q即可

很有助于我们进行复杂的查询操作

修改操作

①对要操作的对象集合统一修改

  1. 先通过查询操作获取books
  2. 对这个Queryset调用update方法,实现批量修改( books.update(price=100) )

②对要操作的对象集合逐一修改

  1. 先通过查询操作获取books
  2. 通过循环逐一访问属性值,将其修改为目标值
  3. 调用该对象的save方法保存修改结果

③对要操作的对象集合在原有基础上统一增减

这里要用到django的F对象

from django.db.models import F

问题情境一:使书店中所有书在原基础上涨价10元

使用方法:Book.objects.all().update(price=F('price')+10)

即**F('字段名')**可以针对单一对象的字段值进行操作,这样操作的效率将高于访问每一个Book属性值并对其进行修改然后保存的操作

问题情境二:查询书店中所有市场价高于零售价的书

使用方法:books = Book.objects.fillter(market_price__gt(F('price'))

__gt表示的就是大于,在前面的查询操作扩展中有提到

有了F对象后,可以快速实现对同一个对象不同字段比较的结果

删除操作

  • 调用Queryset下的delete方法即可做到完全删除

  • 但实际应用中我们不一定要彻底删除该数据,而是对该数据在查询时隐藏

    这时我们在创建模型时需要一个辅助布尔字段is_active,当执行删除操作时,只需要将该字段设置为False,就能达到删除的目的,但这样操作后,以后任何的查询操作都要增加一个过滤值is_active=True

相关推荐
Logintern0913 分钟前
PostgreSQL 的 ORDER BY 多列排序
数据库·postgresql
爱学堂IT分享31 分钟前
鹤翔老师pmp项目管理培训认证考试课 (直播录播题库送学时证明)【共58课时】-51CTO学堂
后端
今天AI了吗37 分钟前
DeepSeek Harness 深度解析:从评测架构到实战落地
java·网络·数据库·人工智能·架构·java-ee
王的宝库43 分钟前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
数据库小学妹1 小时前
为什么MySQL索引用B+树?从存储底层讲透原理
数据库·mysql·b+树·索引优化·磁盘io·数据库原理
BestHeaker1 小时前
制造业 MES 开发入门:和互联网业务开发的 5 个本质差异(一)
数据库·经验分享·制造业·mes
码事漫谈2 小时前
类型即世界:一个 C++ 程序员的本体论入门
后端
Rain的Java大神之路2 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
自动化监测Learner2 小时前
Navicat Premium 17 中文版安装教程(2026最新版)
java·linux·数据库
张文是假的啊2 小时前
常用JPA注解解释
数据库