Django模型---原理、模型類、管理類
阿新 • • 發佈:2019-01-29
1.原理
通過ORM與資料庫互動,如更換資料庫只需要更改執行環境的配置。
參見“Django專案的流程文章”
ORM是“物件-關係-對映”的簡稱,主要任務是:
- 根據物件的型別生成表結構
- 將物件、列表的操作,轉換為sql語句
- 將sql查詢到的結果轉換為物件、列表
2.模型類(models.Model)及屬性用法
該類繼承models.Model,用於定義一個表,不直接與資料庫互動,此類的物件就是一條資料
例子:
class BookInfo(models.Model):
定義類屬性代表欄位,屬性名不能用連續的下劃線__
例子:
btitle = models.CharField(max_length=20)
欄位分為多種型別:
- AutoField:一個根據實際ID自動增長的IntegerField,通常不指定
- 如果不指定,一個主鍵欄位將自動新增到模型中
- BooleanField:true/false 欄位,此欄位的預設表單控制是CheckboxInput
- NullBooleanField:支援null、true、false三種值
- CharField(max_length=字元長度):字串,預設的表單樣式是 TextInput
- TextField:大文字欄位,一般超過4000使用,預設的表單控制元件是Textarea
- IntegerField:整數
- DecimalField(max_digits=None, decimal_places=None):使用python的Decimal例項表示的十進位制浮點數
- DecimalField.max_digits:位數總數
- DecimalField.decimal_places:小數點後的數字位數
- FloatField:用Python的float例項來表示的浮點數
- DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date例項表示的日期
- 引數DateField.auto_now:每次儲存物件時,自動設定該欄位為當前時間,用於"最後一次修改"的時間戳,它總是使用當前日期,預設為false
- 引數DateField.auto_now_add:當物件第一次被建立時自動設定當前時間,用於“建立”的時間戳,它總是使用當前日期,預設為false
- 該欄位預設對應的表單控制元件是一個TextInput. 在管理員站點添加了一個JavaScript寫的日曆控制元件,和一個“Today"的快捷按鈕,包含了一個額外的invalid_date錯誤訊息鍵
- auto_now_add, auto_now, and default 這些設定是相互排斥的,他們之間的任何組合將會發生錯誤的結果
- TimeField:使用Python的datetime.time例項表示的時間,引數同DateField
- DateTimeField:使用Python的datetime.datetime例項表示的日期和時間,引數同DateField
- FileField:一個上傳檔案的欄位
- ImageField:繼承了FileField的所有屬性和方法,但對上傳的物件進行校驗,確保它是個有效的image
- 一般不使用上訴兩條,檔案被儲存在伺服器中,資料庫只儲存檔案在伺服器中的地址。
欄位選項代表各種約束,用以保證資料的正確性
- 在設定欄位物件時,用關鍵字引數定義
- null:如果為True,Django 將空值以NULL 儲存到資料庫中,預設值是 False
- blank:如果為True,則該欄位允許為空白,預設值是 False。對比:null是資料庫範疇的概念,blank是表單驗證證範疇的
- db_column:欄位的名稱,如果未指定,則使用屬性的名稱
- db_index:若值為 True, 則在表中會為此欄位建立索引
- default:預設值,在資料庫表結構中現實為NULL,但給表新增資料時可以使用。
- primary_key:若為 True, 則該欄位會成為模型的主鍵欄位
- unique:如果為 True, 這個欄位在表中必須有唯一值
表間的關係也用類屬性表示包含:
例子:
class HeroInfo(models.Model):
hbook = models.ForeignKey('BookInfo')
關係分為三種:
- ForeignKey:一對多,將欄位定義在多的端中
- ManyToManyField:多對多,將欄位定義在兩端中
- OneToOneField:一對一,將欄位定義在任意一端中
表間訪問:
一訪問多:物件.模型類小寫_set
book.heroinfo_set#一本書中包含的英雄,為一個set
多訪問一,物件.屬性_idhero.book_id#英雄所在的書名
定義資料表的名稱用元選項:class BookInfo(models.Model):
class Meta:
db_table="bookinfo"#指定表名稱
objects屬性:繼承自Manager類,用於資料庫互動
如果自定義了一個類屬性繼承了Manager類,objects屬性作廢
3.管理類models.Manager( )、 用於與資料庫互動,是ORM的核心, 自定義Manager類屬性的應用: 改寫manager類方法,實現邏輯刪除
class BookInfoManager(models.Manager):
def get_queryset(self):#重寫Manager類的方法
return super(BookInfoManager, self).get_queryset().filter(isDelete=False)#篩選出沒有被邏輯刪除的物件
class BookInfo(models.Model):
...
books = BookInfoManager()#重新定義類屬性,呼叫manager類與資料庫互動
利用manager物件,簡化建立模型類的物件class BookInfoManager(models.Manager):
def create_book(self, title, pub_date):#定義一個方法,簡化建立模型類物件
book = self.model()
book.btitle = title
book.bpub_date = pub_date
book.bread=0#可以設定預設值
book.bcommet=0
book.isDelete = False
return book
class BookInfo(models.Model):
...
books = BookInfoManager()#定義一個模型類呼叫管理類
呼叫:book=BookInfo.books.create_book("abc",datetime(1980,1,1))
儲存:book.save()