Django母婴商城项目实践(六)- Models模型之ORM操作

6、Models模型操作

1 ORM概述

  • 介绍
    • Django对数据进行增删改操作是借助内置的ORM框架(Object Relational Mapping,对象关系映射)所提供的API方法实现的,允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库。
    • 简单来说,ORM框架的数据操作API是在 QuerySet 类中定义的,由开发者自定义模型对象调用 QuerySet类,来实现数据的操作。

  • 作用
    1. 建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库。
    2. 根据设计的模型类生成数据库中的表格。
    3. 通过简单的配置就可以进行数据库的切换。

  • 好处
    1. 只需要面向对象编程, 不需要面向数据库编写代码.
      • 对数据库的操作都转化成对类属性和方法的操作.
      • 不用编写各种数据库的sql语句.
    2. 实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异.
      • 不在关注用的是mysql、oracle…等数据库的内部细节.
      • 通过简单的配置就可以轻松更换数据库, 而不需要修改代码.

  • 缺点
    1. 对于复杂业务,使用成本较高
    2. 根据对象的操作转换成SQL语句,根据查询的结果转化成对象, 在映射过程中有性能损失.

  • ORM 示意
    在这里插入图片描述


    在这里插入图片描述

1、增加数据

  • 为了演示 Django项目的增删改操作,可以使用 Django 的 shell 模式(启动命令行和执行脚本)进行讲述,该模式方便开发人员开发与调试程序。
  • 在Terminal中开启Shell模式,执行命令:python manage.py shell,演示示例:

1 新增数据

(base) PS C:\ProjectManager\tianfu\babys> python .\manage.py shell
11 objects imported automatically (use -v 2 for details).Python 3.12.4 | packaged by Anaconda, Inc. | (main, Jun 18 2024, 15:03:56) [MSC v.1929 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.25.0 -- An enhanced Interactive Python. Type '?' for help.from commodity.models import Types, CommodityInfos# 1 基本数据添加方法
# 方法1:创建对象,给对象的属性赋值,调用save方法保存
t1 = Types()
t1.firsts = '儿童服饰';
t2.seconds = "女装"
t1.seconds = "女装"
t1.save()# 方法2:创建对象时,为对象的属性赋值,调用save方法保存
t2 = Types.objects.create(firsts="儿童教育", seconds="python书籍")
t2.save()# 方法3: 通过对象的objects下的create方法
t3 = Types.objects.create(firsts="儿童用品", seconds="摇摇车")
t3.save()# 方法3: 通过对象的objects下的create方法[参数较多时,可使用字典构建,在拆解]
t4_dict = {'firsts': '儿童用品', 'seconds': '早教机', 'add_time': '2025-02-12 11:08:08'}
t4 = Types.objects.get_or_create(**t4_dict)

2 获取添加
  • 在执行数据新增时,为了保证数据的有效性,需要对数据进行去重判断,以确保数据不会重复新增:

    • 方案1:对数据表进行查询,如果查询结果不存在,则执行新增数据。

    • 方案2:Django提供 get_or_create() 方法 (推荐)

      # 对应的SQL语句:
      #  SELECT * FROM commodity_types WHERE firsts = '童装' AND seconds = '男装';
      #  INSERT INTO commodity_types (firsts, seconds) VALUES ('童装', '男装');
      t5_dict = dict(firsts='儿童服装', seconds='男装')
      t5 = Types.objects.get_or_create(**t5_dict)
      t5   # 返回元组:(<Types: 22>, True),第一个参数表示新建的对象,第二个参数表示操作的结果
      t5[0].firsts   # '儿童服装'
      t5[0].seconds   # '男装't5_dict = dict(firsts='儿童服装', seconds='潮牌')
      t5 = Types.objects.get_or_create(**t5_dict)
      t5
      t5[0].seconds
      
      • 说明
        • get_or_create 根据每个模型字段的值与数据表的数据进行判断:
          • 只要有一个模型字段的值与数据表的数据不相同(除主键以外),就会执行新增数据操作。
          • 如果每个模型字段的值与数据表的某行数据完全相同,则就不执行新增,反而返回这个这行数据的数据对象。

3 更新添加

  • Django中还提供了 update_or_create 方法,用于判断当前数据在数据表中是否存在,若存在则执行更新操作,否则在数据表中新增数据。

    # 对应的SQL语句:
    #  SELECT * FROM commodity_types WHERE firsts = '儿童早教' AND second = '儿童玩具';
    # UPDATE commodity_types SET third = NULL, addtime = NOW() WHERE id = 5;    --存在
    # INSERT INTO commodity_types (firsts, second, third, addtime) VALUES ('儿童早教', '儿童玩具', NULL, NOW());   -- 不存在In [26]: d4 = dict(firsts="儿童早教", second="儿童玩具")
    In [27]: t4 = Types.objects.update_or_create(**d4)In [28]: t4
    Out[28]: (<Types: 22>, True)In [29]: t4 = Types.objects.update_or_create(**d4)
    In [30]: t4
    Out[30]: (<Types: 22>, False)In [31]: t4[0].id
    Out[31]: 22
    

4 批量新增

  • 如果想要对某个模型执行数据批量新增操作,则可以使用 bulk_create 方法实现,只需要就爱那个数据对象以列表或元组的形式传入 bulk_create 方法:

    # 对应的SQL语句:INSERT INTO commodity_types (firsts, second, third, addtime) VALUES ('儿童用品', '湿纸巾', NULL, NOW()), ('儿童用品', '纸尿裤', NULL, NOW());In [32]: t5 = Types(firsts="儿童用品", second="湿纸巾")
    In [33]: t6 = Types(firsts="儿童用品", second="纸尿裤")
    In [34]: obj_lists = [t5, t6]
    In [35]: Types.objects.bulk_create(obj_lists)
    Out[35]: [<Types: None>, <Types: None>]
  • 在使用 bulk_create 方法前,数据类型为模型Types的实例化对象,并且在实例化过程中设置每一个字段的值,最后将所有实例化对象存放在列表或元组中,以参数的形式传递给 bulk_create 方法,从而实现数据批量化的新增操作。

2、更新数据

  • 更新数据操作与新增数据步骤大致相同,唯一的区别就在于数据对象来自数据表,需要执行一次数据查询,查询的结果以对象的形式表示,并将对象的属性进行赋值处理。

    # 方法1:查询单条数据后更新
    # 对应SQL语句:
    # SELECT * FROM commodity_types WHERE id = 11;
    # UPDATE commodity_types SET firsts = '儿童用品', third = NULL WHERE id = 11;In [36]: t = Types.objects.get(id=11)
    In [37]: t.firsts = "儿童用品"
    In [38]: t.save()In [39]: t.firsts
    Out[39]: '儿童用品'# 方法2:批量更新一条或多条数据
    #  查询方式使用 filter:以列表的形式返回,查询结果可能是一条或多条# 对应的SQL语句:UPDATE commodity_types SET second = '湿纸巾裤' WHERE id = 23;
    In [40]: t = Types.objects.filter(id=23)
    In [41]: t
    Out[41]: <QuerySet [<Types: 23>]>In [42]: t.update(sencond='湿纸巾裤')
    Out[42]: 1# 更新数据以字典格式表示
    # 对应的SQL语句:UPDATE commodity_types SET second = '童鞋' WHERE id = 23;
    In [43]: d = dict(second='童鞋')
    In [44]: Types.objects.filter(id=23).update(**d)# 方法3:不查询直接修改:默认是对全表的数据进行更新
    # 对应的SQL语句:UPDATE commodity_types SET firsts = '母婴用品';
    In [44]: Types.objects.update(frists="母婴用品")# 方法4:对数据某列自增或自减
    # 对应SQL语句:UPDATE commodity_types SET id = id + 10 WHERE id = 23;
    In [

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89901.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PTA数据结构 | C语言版】哥尼斯堡的“七桥问题”

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 哥尼斯堡是位于普累格河上的一座城市&#xff0c;它包含两个岛屿及连接它们的七座桥&#xff0c;如下图所示。 可否走过这样的七座桥&#xff0c;而且每桥只走过一次&#xff1f;瑞士数学家欧拉(Leo…

Redis 详解:从入门到进阶

文章目录前言一、什么是 Redis&#xff1f;二、Redis 使用场景1. 缓存热点数据2. 消息队列3. 分布式锁4. 限流与防刷5. 计数器、排行榜三、缓存三大问题&#xff1a;雪崩 / 穿透 / 击穿1. ❄️ 缓存雪崩&#xff08;Cache Avalanche&#xff09;2. &#x1f50d; 缓存穿透&…

QCustomPlot 使用教程

下载网址&#xff1a;官方网站&#xff1a;http://www.qcustomplot.com/我的环境是 window10 qt5.9.9 下载后&#xff0c;官网提供了很多例子。可以作为参考直接运行自己如何使用&#xff1a;第一步&#xff1a;使用QCustomPlot非常简单&#xff0c;只需要把qcustomplot.cpp和…

基于springboot+mysql的作业管理系统(源码+论文)

一、开发环境 1 Spring Boot框架简介 描述&#xff1a; 简化开发&#xff1a;Spring Boot旨在简化新Spring应用的初始搭建和开发过程。配置方式&#xff1a;采用特定的配置方式&#xff0c;减少样板化配置&#xff0c;使开发人员无需定义繁琐的配置。开发工具&#xff1a;可…

LVS 集群技术基础

LVS(linux virual server)LVS集群技术---NAT模式一.准备四台虚拟机1.client(eth0ip:172.254.100)2.lvs(eth0ip:172.254.200;eth1ip:192.168.0.200)3.rs1(eht0ip:192.168.0.10)4.rs2(eth0ip:192.168.0.20)二&#xff1a;在rs1和rs2安装httpd功能dnf/yum install htppd -y三&…

Oracle RU19.28补丁发布,一键升级稳

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;15年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝15万 擅长主流Oracle、MySQL、PG、高斯及…

lvs 集群技术

LVS概念LVS&#xff1a;Linux Virtual Server&#xff0c;负载调度器&#xff0c;是一种基于Linux操作系统内核的高性能、高可用网络服务负载均衡解决方案。LVS工作原理基于网络层&#xff08;四层&#xff0c;传输层&#xff09;的负载均衡技术&#xff0c;它通过内核级别的IP…

AR巡检和传统巡检的区别

随着工业4.0时代的到来&#xff0c;数字化转型逐渐成为各行各业提升效率、保障安全和降低成本的关键。而在这一转型过程中&#xff0c;巡检工作作为确保设备稳定运行的重要环节&#xff0c;逐步从传统方式走向智能化、数字化。尤其是增强现实&#xff08;AR&#xff09;技术的引…

Axure设计设备外壳 - AxureMost 落葵网

在UI设计中&#xff0c;设备外壳&#xff08;硬件外壳与界面中的“虚拟外壳”&#xff09;和背景是构成视觉体验的核心元素&#xff0c;它们不仅影响美观&#xff0c;更直接关联用户对功能的理解和操作效率。以下从设计角度详细解析其作用与使用逻辑&#xff1a; 一、设备外壳&…

基于深度学习的电信号分类识别与混淆矩阵分析

基于深度学习的电信号分类识别与混淆矩阵分析 1. 引言 1.1 研究背景与意义 电信号分类识别是信号处理领域的重要研究方向,在医疗诊断、工业检测、通信系统等多个领域有着广泛的应用。传统的电信号分类方法主要依赖于手工提取特征和浅层机器学习模型,但这些方法往往难以捕捉…

Git 和Gitee远程连接 上传和克隆

第一步创建远程库第二步初始化本地库创建链接删掉.idea 和target(这两个没用运行就自动生成了)右键空白处选择Git Bash Here 初始化本地库git init建立远程连接建立连接这里是我的地址&#xff0c;后面拼接你的地址git remote add origin https://gitee.com/liu-qing_liang/git…

零基础100天CNN实战计划:用Python从入门到图像识别高手

一、为什么你需要这份100天CNN学习计划&#xff1f; 在人工智能领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09; 是计算机视觉的基石技术。无论是人脸识别、医学影像分析还是自动驾驶&#xff0c;CNN都扮演着核心角色。但对于初学者来说&#xff0c;面对复杂的数学公…

Python Matplotlib中的fontdict参数说明

文章目录 1 fontdict 参数的常用属性 1.1 使用示例 1.2 其他注意事项 1.3 结合其他参数 各位老板好, 在 Python 的 Matplotlib 库中,fontdict 参数用于定义文本属性的字典。这些属性包括字体大小、颜色、样式等,主要用于控制标题、标签和其他文本元素的显示效果。通过将 font…

25数据库三级备考自整理笔记

备考策略&#xff1a;博主是边做题边学习知识点的&#xff0c;从每个章节->每套真题的流程&#xff0c;知识点清晰详细&#xff0c;喜欢的请点个关注和收藏&#xff0c;祝大家考试顺利&#xff0c;必过必过必过&#xff01;一、数据库应用系统开发方法1.数据库的三级模式&am…

文娱投资的逆势突破:博派资本的文化旅游综合体战略

在多数资本因“变现难、政策风险、退出缓慢”等问题纷纷撤离文娱赛道时&#xff0c;博派资本创始人郑兰却选择逆势而上&#xff0c;聚焦线下文化消费&#xff0c;并推出了全新的文化旅游综合体战略。郑兰深刻认为&#xff0c;2025年将成为区域经济和文化产业复苏的关键节点。她…

「日拱一码」033 机器学习——严格划分

目录 简单随机划分&#xff08;train_test_split&#xff09; 分组划分&#xff08;Group Splitting&#xff09; 简单分组划分 (Group Splitting) 分层分组划分 (Stratified Group Splitting) 交叉验证法&#xff08;Cross-Validation&#xff09; 分组K 折交叉验证&…

ASP.NET Core Web API 中集成 DeveloperSharp.RabbitMQ

文章目录前言一、核心特性与设计理念极简API设计二、使用步骤1.配置 RabbitMQ 连接&#xff08;配置文件设置&#xff09;2.发送消息&#xff08;在 Controller 中&#xff09;3.消费消息&#xff08;后台服务&#xff09;4.注册托管服务三、消息生命周期控制四、高级用法延时队…

解决Flutter运行android提示Deprecated imperative apply of Flutter‘s Gradle plugins

文章目录 出现场景 解决方案 编辑android/settings.gradle 编辑android/build.gradle 重新定义库变量 编辑android/app/build.gradle 删除fluttetRoot和plugin字段 添加plugins块 修改dependencies 出现场景 ado@adodeMacBook-Air app_demo % flutter run --profile Launching…

音视频重回顾及nat内网穿透相关再整理笔记

以前系统得粗略对音视频有过技术栈基类&#xff0c;现在重新回顾。 除此之外&#xff0c;最近刚好实现一个双网卡加入内网的测试方案&#xff0c;涉及内网穿透的知识&#xff0c;刚好对内网穿透逻辑进行整理。 1&#xff1a;明确相关基础知识&#xff0c;解惑体系架构。2&#…

深入理解 SemaphoreSlim 在.NET Core API 开发中的应用

目录 什么是 SemaphoreSlim SemaphoreSlim 的核心方法 构造函数 等待方法 释放方法 基本使用模式 同步使用模式 异步使用模式&#xff08;推荐在 API 中使用&#xff09; 在 Web 开发中的常见用途 1. 限制 API 接口的并发请求数 2. 保护共享资源的并发访问 3. 控制…