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
英文地址,請注明出處:http://en.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. 控制…