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

BigIntegerField()         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)

MVC模型是一種使用 Model View Controller( 模型-視圖-控制器)設計創建 Web 應用程序的模式。

Model(模型):是應用程序中用於處理應用程序數據邏輯的部分。
    通常模型對象負責在數據庫中存取數據。

View(視圖):是應用程序中處理數據顯示的部分。
    通常視圖是依據模型數據創建的。

Controller(控制器):是應用程序中處理用戶交互的部分。
    通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。

MTV模型
FLask用的是MTV的模式
所謂的MTV ( Model–Template–View ),翻譯一下就是模型、模板、視圖。
一般是用戶通過瀏覽器向我們的服務器發起一個請求(request),
這個請求回去訪問視圖函數,(如果不涉及到數據調用,那麼這個時候視圖函數返回一個模板也就是一個網頁給用戶),視圖函數調用模型,模型去數據庫查找數據,然後逐級返回,視圖函數把返回的數據填充到模板中空格中,最後返回網頁給用戶。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章