当前位置: 首页 > news >正文

Django——ORM增删改查

基本对象

model.objects

创建数据

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

python manage.py shell

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

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

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

# 方法一
book1 = Book.objects.create(title='python',pub='unknown',price=20)# 此时数据库中就已经有了这样一条数据#方法二
book2 = Book(title='python',pub='unknown',price=20)book2.save() # 至此才成功创建book2的数据

查询操作 

# 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

相关文章:

  • React18源码: schedule任务调度messageChannel
  • ssm+springmvc基于springboot的宠物领养系统的设计与实现_j5fk4
  • 【Java】RestClient的使用
  • Stable Diffusion 绘画入门教程(webui)-ControlNet(IP2P)
  • Mybatis总结二
  • JavaScript从零写网站《一瞬》开发日志20240223
  • 10.CSS3的calc函数
  • 【深度学习】LoRA: Low-Rank Adaptation of Large Language Models,论文解读
  • 算法:位运算问题和概率问题
  • Flutter插件开发指南01: 通道Channel的编写与实现
  • OpenAI 的 GPTs 提示词泄露攻击与防护实战:防御卷(一)
  • VantUI组件的安装和使用
  • 2024022301-关系代数
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • 第五章、策略模式
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • CentOS从零开始部署Nodejs项目
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • es6(二):字符串的扩展
  • Fundebug计费标准解释:事件数是如何定义的?
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Javascripit类型转换比较那点事儿,双等号(==)
  • javascript 总结(常用工具类的封装)
  • Java超时控制的实现
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Python利用正则抓取网页内容保存到本地
  • Yeoman_Bower_Grunt
  • 关于Flux,Vuex,Redux的思考
  • 近期前端发展计划
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 使用 @font-face
  • 使用common-codec进行md5加密
  • 世界上最简单的无等待算法(getAndIncrement)
  • 小程序开发中的那些坑
  • 携程小程序初体验
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (2020)Java后端开发----(面试题和笔试题)
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (三)elasticsearch 源码之启动流程分析
  • (十三)Flask之特殊装饰器详解
  • (四)Linux Shell编程——输入输出重定向
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • *Django中的Ajax 纯js的书写样式1
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .NET项目中存在多个web.config文件时的加载顺序
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [2023年]-hadoop面试真题(一)
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序