1. 程式人生 > >django之ORM介紹與基本用法(一)

django之ORM介紹與基本用法(一)

 

一、ORM介紹

1.什麼是ORM

  • ORM 全拼Object-Relation Mapping.

  • 中文意為 物件-關係對映.

  • MVC/MVT設計模式中的Model模組中都包括ORM

2.ORM優勢

(1)只需要面向物件程式設計, 不需要面向資料庫編寫程式碼.

  • 對資料庫的操作都轉化成對類屬性和方法的操作.
  • 不用編寫各種資料庫的sql語句.

(2)實現了資料模型與資料庫的解耦, 遮蔽了不同資料庫操作上的差異.

  • 不在關注用的是mysqloracle...等.
  • 通過簡單的配置就可以輕鬆更換資料庫, 而不需要修改程式碼.

3.ORM劣勢

  • 相比較直接使用SQL語句操作資料庫,有效能損失.
  • 根據物件的操作轉換成SQL語句,根據查詢的結果轉化成物件, 在對映過程中有效能損失.

4.ORM和資料庫關係:

Djangomodel是你資料的單一、明確的資訊來源。它包含了你儲存的資料的重要欄位和行為。通常,一個模型(model)對映到一個數據庫表.

基本情況:

每個模型都是一個Python類,它是django.db.models.Model的子類。

模型的每個屬性都代表一個數據庫欄位。

綜上所述,Django為您提供了一個自動生成的資料庫訪問API

二、ORM用法

1.欄位型別:

屬性名 = models.欄位型別,定義屬性時需要指定欄位型別, 通過欄位型別的引數指定選項

屬性名

  • 不允許使用python的保留關鍵字
  • 不允許使用mysql的保留關鍵字
  • 不允許使用連續的下劃線,因為Django的查詢語法就是連續的下劃線

AutoField自動增長的IntegerField, 不指定時Django會自動建立屬性名為id的自動增長屬性

BooleanField:布林欄位,值為TrueFalse

NullBooleanField:支援NullTrueFalse三種值

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)