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)
常用欄位列舉
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