常用字段
注意:
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
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),
這個請求回去訪問視圖函數,(如果不涉及到數據調用,那麼這個時候視圖函數返回一個模板也就是一個網頁給用戶),視圖函數調用模型,模型去數據庫查找數據,然後逐級返回,視圖函數把返回的數據填充到模板中空格中,最後返回網頁給用戶。