1. 程式人生 > >Django常用欄位及引數、事務、資料庫查詢優化

Django常用欄位及引數、事務、資料庫查詢優化

常用欄位

注意:

Django中沒有設定對應char型別的欄位,但可以支援自己定義。

自定義對應於資料庫的char型別欄位:

from django.db.models import Field

class RealCharField(Field):
    '''
    自定義的char型別欄位
    '''
    def __init__(self,max_length,*args,**kwargs):
        self.max_length = max_length #攔截一個父類的方法,操作完之後,利用super呼叫父類方法
        super().__init__(max_length=max_length,*args,**kwargs)

    def db_type(self,connection):
        '''
        限定生成的資料庫欄位型別char,長度為max_length指定的值
        :param connection:
        :return:
        '''
        return 'char(%s)'%self.max_length

class Movie(models.Model):
    textField = RealCharField(max_length=64)
自定義char欄位

常用欄位列舉

AutoField(primary_key=True)  # int自增列,主鍵欄位

CharField(max_length=32)   # 對應資料庫中的varchar欄位,必須提供max_length引數, max_length表示字元長度

IntegerField()           int

BigIntergerField()         bigint

DecimalField()          decimal

EmailField()           varchart(254)

DateField()         # 年月日

DateTimeField()       # 年月日時分秒

BooleanField(Field)          # 給該欄位傳佈爾值 會對應成  數字0/1
 
TextField(Field)            # 文字型別

FileField(Field)           # 路徑儲存在資料庫,檔案上傳到指定目錄
     # upload_to = '指定檔案路徑'
     # 給該FileField欄位傳檔案物件 檔案會自動儲存到upload_to指定的資料夾下 然後該欄位存檔案的路徑

常用欄位引數

null  # 用於表示某個欄位可以為空。

unique  #如果設定為unique=True 則該欄位在此表中必須是唯一的 。

db_index  #如果db_index=True 則代表著為此欄位設定索引。

default   #為該欄位設定預設值。

DateField和DateTimeField欄位引數

auto_now_add  #配置auto_now_add=True,建立資料記錄的時候會把當前時間新增到資料庫。

auto_now    #配置上auto_now=True,每次更新資料記錄的時候會更新該欄位。

外來鍵欄位引數

外來鍵型別在ORM中用來表示外來鍵關聯關係

to     #設定要關聯的表

to_field     #設定要關聯的表的欄位

Choice引數

如性別,學歷,婚否等一些資料能夠被你列舉完全  你就可以考慮使用choices引數

class Userinfo(models.Model):
    username = models.CharField(max_length=32)
    gender_choices = (
        (1, '男'),
        (2, '女'),
        (3, '其他'),
    )
    gender = models.IntegerField(choices=gender_choices)
    #該欄位還是存數字,還可以存匹配關係之外的數字

資料庫查詢優化

only()與defer()

only():括號內傳欄位 得到的結果是一個列表套資料物件,該物件內只含有括號內指定的欄位。
物件點該欄位屬性是不會走資料庫查詢的,但是你一旦點了非括號內的欄位,也能夠拿到資料,但是是重新走的資料庫查詢

    res = models.Book.objects.only('title') #這些物件內部只有title屬性
    for r in res:
        print(r.title)     #不走資料庫查詢
        print(r.price)     #走資料庫查詢

defer():與only相反,括號內傳欄位 得到的結果是一個列表套資料物件,該物件內沒有括號內指定的欄位屬性,物件點該欄位屬性會重複走資料庫,但是你一旦點了非括號內的欄位,就不走資料庫查詢了。

    res = models.Book.objects.defer('title')  # defer與only互為反關係
    for r in res:
        print(r.title)     #走資料庫查詢
        print(r.price)     #不走資料庫查詢

select_related和prefetch_related

select_related內部是連結串列操作,會將關係表全部連線起來拼成一個大表,之後一次性查詢出來,把所有資料都封裝到一個物件中。
資料物件再獲取任意表中的資料的時候都不需要再走資料庫了,因為全部封裝成了物件的屬性。

    res = models.Book.objects.select_related('publish')
    for r in res:
        print(r.publish.name)
''' select_related括號內只能傳外來鍵欄位,並且不能是多對多欄位,只能是一對一和一對多欄位 select_related(外來鍵欄位1__外來鍵欄位2__外來鍵欄位3) '''

prefetch_related內部是子查詢,但是給你的感覺是連結串列操作。

內部通過子查詢將外來鍵管理表中的資料也全部給你封裝到物件中,之後物件點當前表或外來鍵關聯表中的欄位也都不需要走資料庫了

兩者優缺點比較:

select_related連結串列操作,優勢在於只走一次sql查詢,耗時耗在連線表的操作

prefetch_related子查詢,走兩次sql查詢,耗時耗在查詢次數

Django orm開啟事務操作

事務的定義:將多個sql語句操作變成原子性操作,要麼同時成功,有一個失敗則裡面回滾到原來的狀態,保證資料的完整性和一致性

事務的四大特性(ACID):
  原子性
  一致性
  隔離性
  永續性

# django orm 開啟事務操作    
from django.db import transaction
with transaction.atomic(): #在with程式碼塊中執行的orm語句同屬於一個事務 pass #程式碼塊執行結束,事務就結束了

MTV與MVC模型

MTV django 號稱是MTV框架

M:models
T:templates
V:views

MVC

M:models
V:views
C:contronner 控制器(路由分發 urls.py)

MTV本質也是MVC

 

&n