1. 程式人生 > >Django模型---原理、模型類、管理類

Django模型---原理、模型類、管理類

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
             多訪問一,物件.屬性_id
hero.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()