教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

Django orm的基本使用方法之一

更新時(shí)間:2018年12月13日13時(shí)35分 來(lái)源:傳智播客 瀏覽次數(shù):

ORM( Object relational mapping 對(duì)象關(guān)系映射
D:把面向?qū)ο笾械念惡蛿?shù)據(jù)庫(kù)表一一對(duì)應(yīng)起來(lái),在django項(xiàng)目與數(shù)據(jù)庫(kù)之間起著橋梁的                
    角色
E:通過(guò)操作類和對(duì)象,對(duì)數(shù)據(jù)庫(kù)表實(shí)現(xiàn)數(shù)據(jù)的增刪改查等操作,而不需要寫SQL語(yǔ)句
    使用ORM可以通過(guò)方便的配置,切換使用不同的數(shù)據(jù)庫(kù)
U:①使用django進(jìn)行數(shù)據(jù)庫(kù)開發(fā)步驟:
    1. 在models.py中定義模型類(生成表名為應(yīng)用名_模型類名小寫)
2. 生成遷移文件: python manage.D呃py makemigrations
3. 執(zhí)行遷移生成數(shù)據(jù)庫(kù)表(默認(rèn)使用sqlite3數(shù)據(jù)庫(kù),生成的數(shù)據(jù)庫(kù)名為:db.sqlite3): python manage.py migrate
4. 安裝sqliteman:sudo apt-get install sqliteman;啟動(dòng):sqliteman
5. 通過(guò)模型類和對(duì)象,對(duì)數(shù)據(jù)進(jìn)行增刪改查

通過(guò)ORM對(duì)數(shù)據(jù)庫(kù)增刪改:
可以進(jìn)入交互模式執(zhí)行代碼:python manage.py shell
創(chuàng)建模型類對(duì)象:a = 模型類()
增/改:a.save()   --------不指定id則默認(rèn)使用上一次id,第一次為1,如果指定id,id不存
                        在則添加數(shù)據(jù),id存在則修改數(shù)據(jù),如id =None,則id=上一次id+1
刪除:a.delete()  --------不指定id即刪除本次id

字段屬性(即數(shù)據(jù)表中對(duì)應(yīng)的字段):
屬性名 = models.字段類型(字段限制)  ------屬性名不可以用python關(guān)鍵字及雙下劃線
字段類型:
字段類型 類型含義 描述
AutoField 自動(dòng)增長(zhǎng)的整數(shù)字段 通常不需要指定,Django會(huì)自動(dòng)創(chuàng)建屬性名為id的自動(dòng)增長(zhǎng)屬性
BooleanField 布爾字段 值為True或False
NullBooleanField 空布爾字段 支持Null、True、False三種值。
CharField  字符串字段 必須指定參數(shù)(max_length=字符個(gè)數(shù))
TextField 大文本字段 一般超過(guò)4000個(gè)字符時(shí)使用
DateField,TimeField,DateTimeField 日期, 時(shí)間, 日期時(shí)間字段 可指定參數(shù)auto_now=False(True:保存對(duì)象,django自動(dòng)為該屬性賦值,默認(rèn)為False);auto_now_add(True:第一次創(chuàng)建,django自動(dòng)為該屬性賦值,默認(rèn)為False)
IntegerField 整數(shù)字段 從 -2147483648 到 2147483647 范圍內(nèi)的值是合法的
DecimalField 十進(jìn)制浮點(diǎn)數(shù) 必須指定參數(shù)(max_digit=總位數(shù),decimal_places=小數(shù)后位數(shù))
FloatField 浮點(diǎn)數(shù) 用python中的float來(lái)表示,有誤差
FileField 上傳文件字段
ImageField 圖片字段 繼承于FileField,對(duì)上傳的內(nèi)容進(jìn)行校驗(yàn),確保是有效的圖片


字段選項(xiàng)(即數(shù)據(jù)表中字段限制):
選項(xiàng) 默認(rèn)值 描述 是否要重新遷移修改表結(jié)構(gòu)
null False True:數(shù)據(jù)庫(kù)中字段允許為空
unique False True:值必須唯一
db_column 屬性名稱 字段名,如果未指定,則使用屬性的名稱
db_index False True:為此字段創(chuàng)建索引。 查看索引:show index from 表名
primary_key False True:則該字段會(huì)成為模型的主鍵字段,一般作為AutoField的選項(xiàng)使用
default 為字段設(shè)置默認(rèn)值
blank False True:html頁(yè)面表單驗(yàn)證時(shí)字段允許為空


通過(guò)ORM查詢數(shù)據(jù)庫(kù):
objects(模型管理器)
D:每個(gè)模型類都有一個(gè)objects的類屬性,由django字段生成
E:查詢數(shù)據(jù)庫(kù)的數(shù)據(jù)或?qū)?shù)據(jù)進(jìn)行操作處理


U:objects中的方法:
objects管理器中的方法 返回類型 作用
模型類.objects.get() 模型對(duì)象 返回一個(gè)對(duì)象,且只能有一個(gè): 如果查到多條數(shù)據(jù),則報(bào):MultipleObjectsReturned 如果查詢不到數(shù)據(jù),則報(bào):DoesNotExist
模型類.objects.filter() QuerySet 返回滿足條件的對(duì)象
模型類.objects.all() QuerySet 返回所有的對(duì)象
模型類.objects.exclude() QuerySet 返回不滿條件的對(duì)象
模型類.objects.order_by() QuerySet 對(duì)查詢結(jié)果集進(jìn)行排序
模型類.objects.aggregate() 字典,例如:{'salary__avg': 9500.0} 進(jìn)行聚合操作 Sum, Count, Max, Min, Avg
模型類.objects.count() 數(shù)字 返回查詢集中對(duì)象的數(shù)目


filter方法
D:模型管理器objects的一種查詢方法
E:實(shí)現(xiàn)條件查詢,返回QuerySet對(duì)象,包含了所滿足條件的數(shù)據(jù)
U:模型類.objects.filter(模型類屬性名__條件名 = 值)
filter條件:
條件 含義 注釋
exact 判等 可以省略
contains; endswith; startswith 模糊查詢 包含; 以什么開頭; 結(jié)尾
isnull 空查詢 是否為空,是返回True,否返回False
in 范圍查詢 在....內(nèi)
gt,lt,gte,lte 比較查詢 大于,小于,大于等于,小于等于
year, date 日期查詢 年,日期


查詢的其他方式
方法 作用 示例
F對(duì)象 引用某字段的值,對(duì)比表中的兩個(gè)字段 查詢語(yǔ)文分?jǐn)?shù)大于數(shù)學(xué)分?jǐn)?shù)的學(xué)生 成績(jī)表.objects.filter(語(yǔ)文__gt=F('數(shù)學(xué)'))
Q對(duì)象 組合多個(gè)查詢條件,通過(guò)(&,|,~)進(jìn)行邏輯操作 Q(條件1)邏輯操作符 Q(條件2) 
order_by 對(duì)查詢結(jié)果進(jìn)行排序(默認(rèn)升序) 升序: 模型類.objects.order_by('字段名') 降序: 模型類.objects.order_by('-字段名')
aggregate 聚合操作,對(duì)多行查詢結(jié)果中的一列進(jìn)行操作,返回一個(gè)值。(有Sum,Count,Max,Min,Avg) 模型類.objects.aggregate(聚合類('模型屬性')) 返回值是一個(gè)字典,格式: {'屬性名__聚合函數(shù)': 值}
count 統(tǒng)計(jì)滿足條件的對(duì)象的個(gè)數(shù),返回值是一個(gè)數(shù)字 模型類.objects.count()


查看orm語(yǔ)句
打開mysqld.cnf sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
重啟mysql服務(wù) sudo service mysql restart
查看mysql日志內(nèi)容 sudo tail -f /var/log/mysql/mysql.log


QuerySet查詢集
D:調(diào)用模型管理器的all, filter, exclude, order_by方法會(huì)產(chǎn)生一個(gè)QuerySet
E:先過(guò)濾得到該查詢集還可以調(diào)用objects的方法操作數(shù)據(jù)
U:①取下標(biāo)操作(下標(biāo)不允許負(fù)數(shù)):b[0]取出QuerySet的第一條數(shù)據(jù),如果不存在則                
    拋異常
    ②切片操作(下標(biāo)不允許負(fù)數(shù)):產(chǎn)生新的QuerySet
    ③get():取出QuerySet的唯一一條數(shù)據(jù),不存在或者多條則拋異常
    ④exsit():判斷是否有數(shù)據(jù)
    ⑤改,刪數(shù)據(jù)庫(kù)數(shù)據(jù):QuerySet對(duì)象.update(屬性1=值1),QuerySet.delete()
特性:①惰性查詢:只有在使用QuerySet中的數(shù)據(jù)時(shí),才會(huì)取查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù)
        ②緩存:第一次遍歷QuerySet中的所有對(duì)象,django會(huì)把數(shù)據(jù)緩存起來(lái),第二次再使用時(shí)會(huì)使                
        用緩存,不會(huì)再次查詢。

一對(duì)多關(guān)聯(lián)查詢
由一類的條件查詢多類數(shù)據(jù)
1.   一類對(duì)象 = 一類類名.objects.get(條件)
    一類對(duì)象.多類類名小寫_set.all()
2.  多類類名.objects.filter(一類類名小寫__一類屬性名__條件 = 值)

由多類的條件查詢一類數(shù)據(jù)
1.   多類對(duì)象 = 多類類名.objects.get(條件)
    多類對(duì)象.關(guān)聯(lián)屬性
2.   一類類名.objects.filter(多類類名小寫__多類屬性名__條件 =值 )

自關(guān)聯(lián)
D:是一種特殊的一對(duì)多關(guān)系
U:自關(guān)聯(lián)關(guān)聯(lián)屬性定義:關(guān)聯(lián)屬性 = models.ForeignKey('self')

自定義模型管理器
D:在模型類中自定義模型管理器,自定義后,Django將不再生成默認(rèn)的objects
E: 功能1:修改管理器返回的原始查詢集
    功能2:在管理器類中添加額外的方法,幫助我們操作模型類對(duì)應(yīng)的數(shù)據(jù)表,減輕視
                    圖函數(shù)中的代碼量,主要做邏輯處理。
U:①在views創(chuàng)建一個(gè)自定義模型管理器類,繼承Manager
    ②重寫父類的方法修改管理器返回的原始查詢集
    ③把操作數(shù)據(jù)庫(kù)的代碼實(shí)現(xiàn)封裝到模型管理器的方法中,返回模型類對(duì)象
    ④在原模型類中:objects=自定義模型管理器類名()    實(shí)現(xiàn)功能1
    ⑤在視圖函數(shù)中調(diào)用objects.③的方法名()   可實(shí)現(xiàn)功能2

作者:傳智播客人工智能+Python培訓(xùn)學(xué)院
首發(fā):http://python.itcast.cn/
0 分享到:
和我們?cè)诰€交談!