Django經常使用字段及參數、事務、數據庫查詢優化

經常使用字段

注意:html

Django中沒有設置對應char類型的字段,但能夠支持本身定義。web

自定義對應於數據庫的char類型字段:sql

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參數django

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內部是子查詢,可是給你的感受是鏈表操做。ide

內部經過子查詢將外鍵管理表中的數據也所有給你封裝到對象中,以後對象點當前表或外鍵關聯表中的字段也都不須要走數據庫了模塊化

二者優缺點比較:

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(控制器):是應用程序中處理用戶交互的部分。
    一般控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。

MVC的優缺點
優勢:

把業務邏輯所有分離到Controller中,模塊化程度高。當業務邏輯變動的時候,不須要變動View和Model,只須要Controller換成另一個Controller就好了 。
觀察者模式能夠作到多視圖同時更新。
缺點:

Controller測試困難。由於視圖同步操做是由View本身執行,而View只能在有UI的環境下運行。在沒有UI環境下對Controller進行單元測試的時候,Controller業務邏輯的正確性是沒法驗證的:Controller更新Model的時候,沒法對View的更新操做進行斷言。
View沒法組件化。View是強依賴特定的Model的,若是須要把這個View抽出來做爲一個另一個應用程序可複用的組件就困難了。由於不一樣程序的的Domain Model是不同的

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

Django的MTV模式
Django的MTV模式的本質和MVC是同樣的,也是爲了各組件間保持鬆耦合關係,只是定義有些不一樣,

Django的MTV分別是:

M 帶包模型(Model) 負責業務對象和數據庫的關係映射(ORM)
T 表明模板(Template) 負責如何把頁面展現給用戶(html)
V 表明視圖 (View) 負責業務邏輯 並在適當時候調用Model和Template
除了以上三層外,還須要一個URL分發器、他的做用是將一個個URL的頁面請求分發給不一樣的View處理,web服務器(中間件)收到一個http請求

1.Django在URLconf裏查找對應的視圖(view)函數來處理http請求
2.視圖函數調用相應的數據模型來存儲數據、調用相應的模板向用戶展現頁面
3.視圖函數處理結束後返回一個http的相應給web服務器
4.web 服務器將響應發送給客戶端

MTV的響應模式以下:1,中間件接收到一個http請求2,django在url路由系統中查找對應的視圖來處理http請求3,視圖函數調用對應的model模型來存儲數據、調用相應的模板來展現頁面

相關文章
相關標籤/搜索