1. 程式人生 > >Django之模型ORM

Django之模型ORM

鏈接 否則 包含 子類 filter 項目 失去 ref bject

Object Relational Mapping(ORM)

ORM介紹

ORM概念

對象關系映射(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向對象與關系數據庫存在的互不匹配的現象的技術。

簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關系數據庫中。

ORM在業務邏輯層和數據庫層之間充當了橋梁的作用。

ORM由來

讓我們從O/R開始。字母O起源於"對象"(Object),而R則來自於"關系"(Relational)。

幾乎所有的軟件開發過程中都會涉及到對象和關系數據庫。在用戶層面和業務邏輯層面,我們是面向對象的。當對象的信息發生變化的時候,我們就需要把對象的信息保存在關系數據庫中。

按照之前的方式來進行開發就會出現程序員會在自己的業務邏輯代碼中夾雜很多SQL語句用來增加、讀取、修改、刪除相關數據,而這些代碼通常都是重復的。

ORM的優勢

ORM解決的主要問題是對象和關系的映射。它通常把一個類和一個表一一對應,類的每個實例對應表中的一條記錄,類的每個屬性對應表中的每個字段。

ORM提供了對數據庫的映射,不用直接編寫SQL代碼,只需像操作對象一樣從數據庫操作數據。

讓軟件開發人員專註於業務邏輯的處理,提高了開發效率。

ORM的劣勢

ORM的缺點是會在一定程度上犧牲程序的執行效率。

ORM用多了SQL語句就不會寫了,關系數據庫相關技能退化...

ORM總結

ORM只是一種工具,工具確實能解決一些重復,簡單的勞動。這是不可否認的。

但我們不能指望某個工具能一勞永逸地解決所有問題,一些特殊問題還是需要特殊處理的。

但是在整個軟件開發過程中需要特殊處理的情況應該都是很少的,否則所謂的工具也就失去了它存在的意義。

Django中的ORM

Model

在Django中model是你數據的單一、明確的信息來源。它包含了你存儲的數據的重要字段和行為。通常,一個模型(model)映射到一個數據庫表,

基本情況:

  • 每個模型都是一個Python類,它是django.db.models.Model的子類。
  • 模型的每個屬性都代表一個數據庫字段。
  • 綜上所述,Django為您提供了一個自動生成的數據庫訪問API,詳詢官方文檔鏈接。

創建一個ORM過程

總結詳細步驟:
        1. 手動創建數據庫
        2. 在app/models.py裏面寫上一個類,必須繼承models.Model這個類 (註意啟動Django項目)
        3. 在Django 項目的settings.py 裏面 配置上數據庫的相關信息
        4. 在Django項目裏的__init__.py裏面寫上 兩句話 import pymysql pymysql.install_as_MySQLdb()
        5. 給Django發布命令 
            1. python manage.py makemigrations  # 相當於去你的models.py 裏面看一下有沒有改動
            2. python manage.py migrate  # 把改動翻譯成SQL語句,然後去數據庫執行
    
        models.py  -->  Django翻譯成SQL --> pymysql  --> MySQL(4p)


總結一下:

models.py   MySQL
類         對應      數據表
類的屬性    對應        數據庫裏面的字段(列)
對象   對應        一行數據(一條數據)


ORM到底是什麽? --> 對象關系映射

ORM操作

#
1. models.Tb1(表名).objects.create(c1=xx, c2=oo)   # 增加一條數據,可以接受字典類型數據 **kwargs
  models.Tb1(表名).objects.create(**{})
2.obj = models.Tb1(c1=xx, c2=oo)
obj.save()


#
models.Tb1.objects.get(id=123)  # 獲取單條數據,不存在則報錯(不建議)
models.Tb1.objects.all()  # 獲取全部
models.Tb1.objects.filter(name=seven)  # 獲取指定條件的數據  ,不滿足條件不報錯,但是返回的結果是一個對象的列表

 models.User.objects.filter().first() # 獲取指定條件的數據 ,的第一個

models.User.objects.filter().last()# 獲取指定條件的數據,的最後一個

models.Tb1.objects.exclude(name=seven)  # 去除指定條件的數據


#
# models.Tb1.objects.filter(name=‘seven‘).delete()  # 刪除指定條件的數據


#
1.models.Tb1.objects.filter(name=seven).update(gender=0)   # 將指定條件的數據更新,均支持 **kwargs

2. obj = models.Tb1.objects.get(id=1)   obj.c1 = 111   obj.save() # 修改單條數據

Django之模型ORM