一、模型
Django對各種數(shù)據(jù)庫提供了很好的支持,Django為這些數(shù)據(jù)庫提供了統(tǒng)一的調(diào)用API(即不管底層操作哪種數(shù)據(jù)庫,我們只管模型對象操作即可封锉,其實就是屏蔽掉數(shù)據(jù)庫操作的差異性),這就可以根據(jù)不同的業(yè)務需求選擇不同的數(shù)據(jù)庫膘螟。
二成福、配置數(shù)據(jù)
- 在工程目錄下init.py文件
import pymysql
pymysql.install_as_MySQLdb()
安裝鏈接mysql的驅(qū)動: pip install pymysql
- 在工程目錄下settings.py文件中,修改DATABASES
DATABASES = {
'default': {
# 修改為mysql(驅(qū)動)
'ENGINE': 'django.db.backends.mysql',
# 鏈接數(shù)據(jù)庫荆残,并創(chuàng)建對應的數(shù)據(jù)庫HelloDjango
'NAME': 'HelloDjango',
# 用戶名
'USER': 'root',
# 密碼
'PASSWORD': '123456',
# 主機
'HOST': '127.0.0.1',
# 端口號
'POST': '3306'
}
}
三奴艾、模型開發(fā)流程
- 配置數(shù)據(jù)庫(創(chuàng)建對應數(shù)據(jù),數(shù)據(jù)庫上述配置)
- 定義模型類(一個模型類對應一個表單)
- 生成遷移文件(python3 manage.py makemigrations)
- 執(zhí)行遷移文件内斯,生成對應表單(python3 manage.py migrate)
- 使用模型類進行增刪改查
四蕴潦、ORM
- 概述
O: 對象
R: 關系
M: 映射
- 任務
- 根據(jù)對象類型生成表結(jié)構(gòu);
- 將對象、列表的操作轉(zhuǎn)換sql語句;
- 將sql語句查詢到的結(jié)果轉(zhuǎn)為對象俘闯、列表;
五潭苞、屬性定義
- 概述
- Django根據(jù)屬性的類型確定以下信息:
當前選擇的數(shù)據(jù)庫支持字段的類型;
渲染管理表單時使用的默認html控件;
在管理站點最低限度的驗證;
- Django的主鍵
會為表增加自增長的主鍵列,每個模型只能有一個主鍵列真朗;
如果使用選項設置某屬性為主鍵列后此疹,則Django不會再生成默認的主鍵列;
- 屬性命名規(guī)則:
遵循標識符規(guī)則;
由于Django的查詢方式,不允許使用連續(xù)的下劃線;
- 庫
- 定義屬性時
需要字段類型遮婶,字段類型是被定義在django.db.models.fields目錄下;
為了方便使用秀菱,被導入到django.db.models中;
- 使用方式
導入from django.db import models;
通過models.field創(chuàng)建字段類型的對象,賦值給屬性;
- 邏輯刪除
對于重要數(shù)據(jù)都做邏輯刪除蹭睡,不做物理刪除;
實現(xiàn)方法是定義isDelete屬性,類型為BooleanField赶么,默認值為False;
- 字段類型
- AutoField
一個根據(jù)實際ID自動增長的IntegerField肩豁,通常不指定;
如果不指定,一個主鍵字段將自動添加到模型中;
- CharField(max_length=字段長度)
字符串清钥,默認的表單樣式TextInput;
- TextField
大文本字段琼锋,一般超過4000使用,默認的表單控件是Textarea;
- IntegerField
整數(shù);
- DecimalField(max_digits=None, decimal_places=None)
使用python的Decimal實例表示的十進制浮點數(shù);
DecimalField.max_digits: 位數(shù)總數(shù);
DecimalField.decimal_places: 小數(shù)點后的數(shù)字位數(shù);
- FloatField
用Python的float實例來表示的浮點數(shù);
- BooleanField
true/false 字段祟昭,此字段的默認表單控制是CheckboxInput;
- NullBooleanField
支持null缕坎、true、false三種值;
- DateField([auto_now=False, auto_now_add=False])
使用Python的datetime.date實例表示的日期;
DateField.auto_now: 每次保存對象時篡悟,自動設置該字段為當前時間谜叹,默認是False;
DateField.auto_now_add: 當對象第一次被創(chuàng)建時自動設置當前時間,它總是使用當前日期,默認是False;
auto_now_add, auto_now, and default 這些設置是相互排斥的搬葬,他們之間的任何組合將會發(fā)生錯誤的結(jié)果;
- TimeField
使用Python的datetime.time實例表示的時間荷腊,參數(shù)同DateField;
- DateTimeField
使用Python的datetime.datetime實例表示的日期和時間,參數(shù)同DateField;
- FileField
一個上傳文件的字段;
- ImageField
繼承了FileField的所有屬性和方法急凰,但對上傳的對象進行校驗女仰,確保它是個有效的image;
- 字段選項(通過字段選項,可以實現(xiàn)對字段的約束)
- null
如果為True抡锈,Django 將空值以NULL 存儲到數(shù)據(jù)庫中疾忍,默認值是 False;
- blank
如果為True,則該字段允許為空白床三,默認值是 False;
null是數(shù)據(jù)庫范疇的概念一罩,blank是表單驗證證范疇的;
- db_column
字段的名稱,如果未指定勿璃,則使用屬性的名稱;
- db_index
若值為 True, 則在表中會為此字段創(chuàng)建索引;
- default
默認值;
- primary_key
若為 True, 則該字段會成為模型的主鍵字段;
- unique
如果為 True, 這個字段在表中必須有唯一值;
- 關系
- ForeignKey:一對多擒抛,將字段定義在多的端中
格式: 對象.模型類小寫_set
示例: grade.students_set
- OneToOneField:一對一,將字段定義在任意一端中
格式: 對象.模型類小寫
示例: grade.students
- 訪問id
格式: 對象.屬性_id
示例: student.sgrade_id
- ManyToManyField:多對多补疑,將字段定義在兩端中
外鍵: 屬于數(shù)據(jù)庫約束
外鍵默認是可以重復的歧沪,對應另外一張表的主鍵(一對多)
六、模型查詢之基本使用
查詢集表示從數(shù)據(jù)庫獲取的對象集合莲组。
查詢集合可以有多個過濾器诊胞。
過濾器就是一個函數(shù),基于所給的參數(shù)限制查詢結(jié)果锹杈。
從SQL角度來說撵孤,查詢集合與select等價,過濾器就像where條件竭望。
- 查詢集
- 在管理器上調(diào)用過濾器方法返回查詢集;
- 查詢集經(jīng)過過濾器篩選后返回新的查詢集邪码,所以可以寫出鏈式調(diào)用;
- 惰性執(zhí)行(創(chuàng)建查詢集不會帶任何數(shù)據(jù)訪問,直到調(diào)用數(shù)據(jù)時才會訪問數(shù)據(jù))
- 直接訪問的情況
- 迭代
- 序列化
- 與if合用
- 過濾器(返回查詢集)
- all() 返回查詢集中所有數(shù)據(jù)(一條數(shù)據(jù)即一個對象)
students = Student.objects.all()
- filter() 返回符合要求的數(shù)據(jù)
filter(鍵=值)
filter(鍵=值,鍵=值)
filter(鍵=值).filter(鍵=值)
students = Student.objects.filter(s_score=91)
students = Student.objects.filter(s_score__lt=60)
- exclude() 過濾掉符合條件的數(shù)據(jù)
students = Student.objects.exclude(s_score=91)
- order_by() 排序
students = Student.objects.order_by('s_score') # 升序
students = Student.objects.order_by('-s_score') # 降序
- values() 返回查詢集中所有數(shù)據(jù)(一條數(shù)據(jù)即一個字典)咬清,返回一個列表
- 返回單個數(shù)據(jù)
- get() 返回一個滿足條件的對象
如果沒有找到符合條件的對象闭专,會引發(fā)'DoesNotExist'異常
如果找到多個對象奴潘,會引發(fā)'MultipleObjectsReturned'異常
- count() 返回查詢集的對象個數(shù)
students = Student.objects.filter(pk=1)
if students.count()>0: # 有數(shù)據(jù)
pass
else:
pass
- first() 返回查詢集中的第一個對象
student = students.first()
- last() 返回查詢集中的最后一個對象
students = students.last()
- exists() 判斷查詢集中是否有數(shù)據(jù),有數(shù)據(jù)返回True
if students.exists(): # 有數(shù)據(jù)
pass
else:
pass
students = Student.objects.get(pk=91), pk是primary key縮寫影钉!
- 限制查詢集(切片)
查詢集返回列表画髓,可以使用下標的方法進行限制,等同于sql語句中的limit語句;
例如: studentList = Students.objects.all()[0:5]
注意: 下標不能是負數(shù)
- 查詢集緩存
- 每個查詢集都包含一個緩存平委,來最小化的數(shù)據(jù)訪問
- 在新建的查詢集時奈虾,緩存首次為空,第一次對查詢集求值廉赔,會發(fā)生數(shù)據(jù)緩存
- django會將查詢出來的數(shù)據(jù)做一個緩存肉微,并返回查詢結(jié)果,以后查詢直接使用查詢集的緩存
- 元選項
- 在模型類中定義Mata類昂勉,用于設置元信息
- db_table屬性
定義數(shù)據(jù)表名浪册,推薦使用小寫字母,數(shù)據(jù)表名默認為項目名小寫_類名;
- ordering屬性
對象的默認排序字段岗照,獲取對象的列表時使用村象;
ordering = ['id'] 升序
ordering = ['-id'] 降序
ordering = ['sage'] 按sage升序
注意: 排序會增加數(shù)據(jù)庫的開銷;
# 學生表students
class Students(models.Model):
# 在沒有添加主鍵時,它會在生成時自動添加主鍵
# id = models.IntegerField()
sname = models.CharField(max_length=30)
ssex = models.CharField(max_length=10)
sage = models.IntegerField()
sbrief = models.CharField(max_length=50)
isdel = models.BooleanField(default=False)
lastTime = models.DateTimeField(auto_now=True)
createTime = models.DateTimeField(auto_now=True)
# sclass = models.CharField(max_length=10)
# 關聯(lián)外鍵(學生都會有一個班級)
sclass = models.ForeignKey('Grades')
def __str__(self):
return '%s %s' % (self.sname,self.sclass)
# 元選項(元信息)
class Meta:
db_table= 'students'
# ordering = ['id']
ordering = ['sage']
str內(nèi)置方法攒至,一般說明類的說明厚者,或者自己定義輸出。
七迫吐、模型查詢之字段查詢
- 概述
- 實現(xiàn)了sql中的where語句库菲,作為方法filter()、excluede()志膀、get()的參數(shù)
- 語法
屬性名稱__比較運算符=值
- 外鍵
屬性名_id
- 轉(zhuǎn)義
like語句中使用%為了匹配占位
filter(sname__contains='%')
- 比較運算符
- exact 判斷(大小寫敏感)
filter(isdel=False)
- contains 是否包含(大小寫敏感)
studentList = Student.objects.filter(sname__contains='孫')
- startswith熙宇、endswith 以value開頭或結(jié)尾(大小寫敏感)
studentList = Student.objects.filter(sname__startswith='孫')
備注:
以上四個前面加上i,表示不區(qū)分大小寫溉浙;
iexact烫止、icontains、istartswith戳稽、iendswith
- isnull馆蠕、isnotnull 是否為空
filter(sname__isnull=False)
- in 是否包含在范圍內(nèi)
studentList = Students.objects.filter(pk__in=[2,3,4,5,6])
- gt大于、gte大于等于惊奇、lt小于互躬、lte小于等于
studentList = Students.objects.filter(sage__gt=30)
- year、mouth颂郎、day吼渡、week_day、hour乓序、minute诞吱、second 時間相關
studentList = Student.objects.filter(lastTime__year=2018)
- 跨關聯(lián)查詢 (處理join查詢)
語法: 模型類名__屬性名__比較符
例如: 學生描述中帶有'張三'的學生屬于哪個班級
grade = Grades.objects.filter(students__sbrief__contains='張三')
- 查詢快捷
pk 代表主鍵(因為主鍵并不一定就是id字段)
student = Students.objects.get(pk=3)
- 聚合函數(shù)
使用aggregate()函數(shù)返回聚合函數(shù)的值【sql中的函數(shù)使用】
例如: Avg()舟奠、Count()、Max()房维、Min()、Sum()
實例:
from django.db.models import Max
maxAge = STudents.objects.aggregate(Max('sage'))
- F對象
- 可以使用模型的A屬性與B屬性進行比較.
例如: Grades.objects.filter(ggirlnum__gt=F('gboynum'))
- 支持F對象的算術(shù)運算
例如: Grades.objects.filter(ggirlnum__gt=F('gboynum')+20)
- Q對象
- 概述
查詢條件的封裝
- 需求
進行or查詢抬纸、進行and查詢咙俩、進行~查詢 【與或非操作】
- 解決
使用Q對象
- 例如
studentList = Students.objects.filter(Q(pk__lte=3) | Q(sage__gt=50))
studentList = Students.objects.filter(Q(pk__lte=3) # 只有一個Q對象就用于匹配
studentList = Students.objects.filter(~Q(pk__lte=3) # 取反
八、模型成員
- 類屬性
- objects管理器
是Manager類型的一個對象湿故,作用是與數(shù)據(jù)庫交互;
當定義模型類是沒有指定管理器阿趁,則Django為模型創(chuàng)建一個名為objects的管理器;
- 自定義管理器
當為模型指定模型管理器,Django就不在為模型類生成objects模型管理對象;
studentsObj = models.Manager() # 自定義模型管理器
- 模型管理器作用
模型管理器是Django的模型與數(shù)據(jù)庫進行交互的接口坛猪;
一個模型可以有多個模型管理器;
- 自定義管理器Manager類
向著管理器中添加額外的方法;
修改管理器返回的原始查詢集(重寫get_queryset());
# 自定義管理器后
# Students.objects.all() # 默認時
Students.studentObj.all() # 自定義管理器為studentObj
<QuerySet [<Students: 韓俊 python05>, <Students: 申寶靜 python05>, <Students: 李嘉熙 python05>, <Students: 小紅 python05>, <Students: 陽亞霞 python01>, <Students: 老王 python04>, <Students: 向芳 python01>, <Students: 哈哈 python05>, <Students: 薛延美 python01>, <Students: 孫獅勤 python05>, <Students: 呵呵 python05>, <Students: 蕭十一郎 python06>, <Students: 武含 python06>, <Students: 李明志 python04>, <Students: 王子衡 python06>, <Students: 陸彥旭 python01>, <Students: 唐李超 python04>, <Students: 郝路杰 python06>, <Students: 夏明宇 python06>, <Students: 范育賓 python01>, '...(remaining elements truncated)...']>
# 自定義管理器Manager類
class StudentsManager(models.Manager):
# 修改管理器返回的原始查詢集合
def all(self):
# 調(diào)用父類方法脖阵,在父類方法基礎上進行再次過濾
return super().all().filter(isdel=False)
# 學生表students
class Students(models.Model):
# 自定義模型管理器
studentObj1 = models.Manager()
# 用到自定義管理器(對數(shù)據(jù)進行過濾)
studentObj2 = StudentsManager()
# 使用1: Students.studentObj1.all()
# 使用2: Students.studentObj2.all()
- 創(chuàng)建模型對象
- 目的
向數(shù)據(jù)庫中添加數(shù)據(jù)
- 注意
當創(chuàng)建對象時,django是不會對數(shù)據(jù)庫進行讀寫操作墅茉;
當調(diào)用save()方法時才會與數(shù)據(jù)庫交互命黔,將對象保存到數(shù)據(jù)庫表單中;
__init__方法已經(jīng)在父類models.Model中使用,在自定義的模型中無法使用;
- 在模型類中添加一個類方法(為了創(chuàng)建對象)
# 學生表students [models.py文件中]
class Students(models.Model):
...
# 定義一個類方法創(chuàng)建對象
@classmethod # 這表明就是類方法
def createStudents(cls,name,sex,age,brief,grade,lastT,createT,isd=False): # cls就表示Students這個類
student = cls(sname=name,ssex=sex,sage=age,sbrief=brief,sclass=grade,lastTime=lastT,createTime=createT,isdel=isd)
return student
# 調(diào)用即快速創(chuàng)建學生對象 [views.py文件中]
stu = Students.createStudents('測試數(shù)據(jù)','男',18,'我是測試數(shù)據(jù)就斤,別太在意.',grade,'2018-05-30','2018-05-29')
- 在定義管理器中添加一個方法(為了創(chuàng)建對象)
# 自定義管理器Manager類
class StudentsManager(models.Manager):
def all(self):
# 調(diào)用父類方法悍募,在父類方法基礎上進行再次過濾
return super().all().filter(isdel=False)
def createStudent(self,name,sex,age,brief,grade,lastT,createT,isd=False):
# self.model() 其實就是創(chuàng)建Students對象
stu = self.model()
stu.sname = name
stu.ssex = sex
stu.sage = age
stu.sbrief = brief
stu.sclass = grade
stu.lastTime = lastT
stu.createTime = createT
return stu
# 調(diào)用即快速創(chuàng)建學生對象 [views.py文件中]
stu = Students.studentObj2.createStudent('測試數(shù)據(jù)','男',18,'我是測試數(shù)據(jù),別太在意.',grade,'2018-05-30','2018-05-29')
十洋机、數(shù)據(jù)庫的更換
使用了ORM對象關系映射坠宴,使用哪種數(shù)據(jù)庫操作都是一樣,就是在設置數(shù)據(jù)庫連接時不一樣绷旗。
DATABASES = {
'default': { # mysql
'ENGINE': 'django.db.backends.mysql', # 驅(qū)動
'NAME': 'HelloDjango',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306'
}
}
DATABASES = {
'default': { # sqlite
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3')
}
}
十一喜鼓、其他
- 查詢數(shù)據(jù)
- 根據(jù)不同條件,獲取對應的數(shù)據(jù)
- 添加數(shù)據(jù)
- 實例化模型對象
- 設置對象屬性
- 調(diào)用對象的save()方法
- 更新數(shù)據(jù)
- 查詢獲取到需要更新的對象
- 設置對象數(shù)據(jù)
- 調(diào)用對象的save()方法
- 刪除數(shù)據(jù)
- 查詢獲取需要刪除出的對象
- 調(diào)用對象的delete()方法
作者:西門奄
鏈接:http://www.reibang.com/u/77035eb804c3
來源:簡書
簡書著作權(quán)歸作者所有衔肢,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處庄岖。