一、ORM介紹
1.什么是ORM
ORM 全拼Object-Relation Mapping.
中文意為 對象-關系映射.
在MVC/MVT設計模式中的Model模塊中都包括ORM
2.ORM優勢
(1)只需要面向對象編程, 不需要面向數據庫編寫代碼.
對數據庫的操作都轉化成對類屬性和方法的操作.
不用編寫各種數據庫的sql語句.
(2)實現了數據模型與數據庫的解耦, 屏蔽了不同數據庫操作上的差異.
不在關注用的是mysql、oracle...等.
通過簡單的配置就可以輕松更換數據庫, 而不需要修改代碼.
3.ORM劣勢
相比較直接使用SQL語句操作數據庫,有性能損失.
根據對象的操作轉換成SQL語句,根據查詢的結果轉化成對象, 在映射過程中有性能損失.
4.ORM和數據庫關系:
在Django中model是你數據的單一、明確的信息來源。它包含了你存儲的數據的重要字段和行為。通常,一個模型(model)映射到一個數據庫表.
基本情況:
每個模型都是一個Python類,它是django.db.models.Model的子類。
模型的每個屬性都代表一個數據庫字段。
綜上所述,Django為您提供了一個自動生成的數據庫訪問API。
二、ORM用法
1.字段類型:
屬性名 = models.字段類型,定義屬性時需要指定字段類型, 通過字段類型的參數指定選項
屬性名
不允許使用python的保留關鍵字
不允許使用mysql的保留關鍵字
不允許使用連續的下划線,因為Django的查詢語法就是連續的下划線
AutoField:自動增長的IntegerField, 不指定時Django會自動創建屬性名為id的自動增長屬性
BooleanField:布爾字段,值為True或False
NullBooleanField:支持Null、True、False三種值
CharField(max_length=20):字符串
參數max_length表示最大字符個數
TextFiled:大文本字段,一般超過4000個字符時使用
IntegerField:整數
DecimalField(max_digits=None, decimal_places=None):可以指定精度的十進制浮點數
參數max_digits表示總位數
參數decimal_places表示小數位數
FloatField():浮點數
DateField[auto_now=False, auto_now_add=False]):日期
參數auto_now表示每次保存對象時,自動設置該字段為當前時間,用於"最后一次修改"的時間戳,它總是使用當前日期,默認為false
參數auto_now_add表示當對象第一次被創建時自動設置當前時間,用於創建的時間戳,它總是使用當前日期,默認為false
參數auto_now_add和auto_now是相互排斥的,組合將會發生錯誤
TimeField:參數和DateField一樣
DateTimeField:日期時間,參數同DateField
FileField:上傳文件字段,以二進制的形式
ImageField:繼承於FileField,對上傳的內容進行校驗,確保是有效的圖片
2.字段選項:
null:如果為True,表示允許為空,默認值是False
blank:如果為True,則該字段允許為空白,默認值是False
對比:null是數據庫范疇的概念,blank是表單驗證范疇的
db_column:字段的名稱,如果未指定,則使用屬性的名稱(只限於數據庫表中的名字,操作數據庫還是類屬性的名字)
db_index:若值為True, 則在表中會為此字段創建索引,默認值是False(為了優化查詢速度 )
default:默認值,這可以是值或可調用對象。如果可調用,則每次創建新對象時都會調用它。
primary_key:若為True,則該字段會成為模型的主鍵字段,默認值是False,一般作為AutoField的選項使用
unique:如果為True, 這個字段在表中必須有唯一值,這個值不能重復,默認值是False
關系型字段類型:關聯表中使用
注意:Django會自動為表創建主鍵字段
如果使用選項設置某屬性為主鍵字段后,Django不會再創建自動增長的主鍵字段
默認創建的主鍵字段為id,可以使用pk代替,pk全拼為primary key
class PeopleInfo(models.Model): name = models.CharField(max_length=20) #人物姓名 gender = models.BooleanField(default=True) #人物性別 description = models.CharField(max_length=20) #人物描述 isDelete = models.BooleanField(default=False) #邏輯刪除 book = models.ForeignKey(BookInfo) # 外鍵約束,人物屬於哪本書 pub_date = models.DateField(null=True) #日期 readcount = models.IntegerField(default=0) #閱讀量 commentcount = models.IntegerField(default=0) #評論量 isDelete = models.BooleanField(default=False) #邏輯刪除 # 元類信息 : 修改表名 class Meta: db_table = 'peopleinfo'
3.關系字段類型
關系型數據庫的關系包括三種類型:
ForeignKey:一對多,將字段定義在多的一端中
ManyToManyField:多對多,將字段定義在任意一端中
OneToOneField:一對一,將字段定義在任意一端中
可以維護遞歸的關聯關系,使用self指定
4.元選項:
作用:修改數據庫表的默認的名稱
數據庫表的默認名稱為 :
應用名_模型名
例:Book應用中定義BookInfo模型類
Book_bookinfo
在模型類中定義元類Meta,用於設置元信息,使用db_table自定義表的名字
# 書籍信息模型
class BookInfo(models.Model):
name = models.CharField(max_length=20) #圖書名稱
class Meta: #元信息類
db_table = 'bookinfo' #自定義表的名字
5.模型成員
objects : 管理器對象
是Manager類型的對象,定義在from django.db import models中
用於模型對象和數據庫交互
是默認自動生成的屬性,但是可以自定義管理器對象
自定義管理器對象后,Django不再生成默認管理器對象objects
自定義管理器對象
為模型類UserInfo自定義管理器對象Users
# 用戶信息模型 class UserInfo(models.Model): name = models.CharField(max_length=20) #名稱 pub_date = models.DateField(null=True) #日期 readcount = models.IntegerField(default=0) #閱讀量 commentcount = models.IntegerField(default=0) #評論量 isDelete = models.BooleanField(default=False) #邏輯刪除
#元類信息 : 修改表名 class Meta: db_table = 'Userinfo'
# 自定義管理器對象 Users = models.Manager() 自定義管理器對象后,查詢數據時直接使用 Users 查詢,不再用默認的objects
# 書籍列表信息視圖 def userList(request): # 查詢數據庫用戶信息 : 默認管理器對象--objects # UserInfos = UserInfo.objects.all()
# 查詢數據庫用戶信息 : 自定義管理器對象--Users UserInfos = UserInfo.Users.all()
# 構造上下文 context = {'Userlist':UserInfos} return render(request, 'User/Userlist.html', context)
Manager:管理器類
定義在from django.db import models中
管理器是Django的模型進行數據庫操作的接口,Django應用的每個模型都擁有至少一個管理器
Django模型支持自定義管理器類,繼承自models.Manager
自定義管理器類主要用於兩種情況
1.修改原始查詢集,重寫get_queryset()方法
查詢時,如果需要默認過濾掉某些數據,需要修改原始查詢集
2.新增管理器方法,如創建模型對象方法
當模型屬性很多,多數字段為默認值,每次只需要給少數屬性賦值時,可以新增模型初始化方法
自定義管理器類:1.修改原始查詢集
把peopleinfo表中的isDelete字段修改為True(updata peopleinfo set isDelete=1 where id=4),但是邏輯刪除字段為True的那條記錄依然會被查詢出來,這里的解決辦法是自定義管理器類,重寫get_queryset()方法
from django.db import models # 自定義管理器類 class PeopleInfoManager(models.Manager): # 自定義管理器類場景一:重寫get_queryset()方法 def get_queryset(self): # 調用父類的成員語法為:super(子類型, self).成員 # 默認只查詢邏輯刪除字段為False的記錄 return super(PeopleInfoManager, self).get_queryset().filter(isDelete=False) 自定義管理器類:2.新增管理器方法 新增管理器初始化模型對象方法:只有name屬性需要賦值,其他的字段都是默認值 # models.py -- 自定義管理器類 class UserInfoManager(models.Manager): # 自定義管理器類場景一:重寫get_queryset()方法 def get_queryset(self): # 調用父類的成員語法為:super(子類型, self).成員 # 默認只查詢邏輯刪除字段為False的記錄 return super(UserInfoManager, self).get_queryset().filter(isDelete=False) # 初始化模型對象方法 def create(self, name): user = UserInfo() user.name = name user.pub_date = '1989-11-11' user.readcount = 0 user.commentcount = 0 user.isDelete = False return user # view.py -- User列表信息視圖 def UserList(request): # 初始化模型對象:自定義管理器類后 UserInfos = [ UserInfo.user.create('小明'), UserInfo.user.create('小傑'), ] # 構造上下文 context = {'Userlist':UserInfos} return render(request, 'User/userlist.html', context)