Django ORM基礎篇【轉載】

ORM( Object relational mapping 對象關係映射
D:把面向對象中的類和數據庫表一一對應起來,在django項目與數據庫之間起着橋樑的                
    角色
E:經過操做類和對象,對數據庫表實現數據的增刪改查等操做,而不須要寫SQL語句
    使用ORM能夠經過方便的配置,切換使用不一樣的數據庫
U:①使用django進行數據庫開發步驟:
    1. 在models.py中定義模型類(生成表名爲應用名_模型類名小寫)
2. 生成遷移文件: python manage.D呃py makemigrations
3. 執行遷移生成數據庫表(默認使用sqlite3數據庫,生成的數據庫名爲:db.sqlite3): python manage.py migrate
4. 安裝sqliteman:sudo apt-get install sqliteman;啓動:sqliteman
5. 經過模型類和對象,對數據進行增刪改查

經過ORM對數據庫增刪改:
能夠進入交互模式執行代碼:python manage.py shell
建立模型類對象:a = 模型類()
增/改:a.save()   --------不指定id則默認使用上一次id,第一次爲1,若是指定id,id不存
                        在則添加數據,id存在則修改數據,如id =None,則id=上一次id+1
刪除:a.delete()  --------不指定id即刪除本次id

字段屬性(即數據表中對應的字段):
屬性名 = models.字段類型(字段限制)  ------屬性名不能夠用python關鍵字及雙下劃線
字段類型:
html

字段類型 類型含義 描述
AutoField 自動增加的整數字段 一般不須要指定,Django會自動建立屬性名爲id的自動增加屬性
BooleanField 布爾字段 值爲True或False
NullBooleanField 空布爾字段 支持Null、True、False三種值。
CharField  字符串字段 必須指定參數(max_length=字符個數)
TextField 大文本字段 通常超過4000個字符時使用
DateField,TimeField,DateTimeField 日期, 時間, 日期時間字段 可指定參數auto_now=False(True:保存對象,django自動爲該屬性賦值,默認爲False);auto_now_add(True:第一次建立,django自動爲該屬性賦值,默認爲False)
IntegerField 整數字段 從 -2147483648 到 2147483647 範圍內的值是合法的
DecimalField 十進制浮點數 必須指定參數(max_digit=總位數,decimal_places=小數後位數)
FloatField 浮點數 用python中的float來表示,有偏差
FileField 上傳文件字段  
ImageField 圖片字段 繼承於FileField,對上傳的內容進行校驗,確保是有效的圖片



字段選項(即數據表中字段限制):
python

選項 默認值 描述 是否要從新遷移修改表結構
null False True:數據庫中字段容許爲空
unique False True:值必須惟一
db_column 屬性名稱 字段名,若是未指定,則使用屬性的名稱
db_index False True:爲此字段建立索引。 查看索引:show index from 表名
primary_key False True:則該字段會成爲模型的主鍵字段,通常做爲AutoField的選項使用
default   爲字段設置默認值
blank False True:html頁面表單驗證時字段容許爲空



經過ORM查詢數據庫:
objects(模型管理器)
D:每一個模型類都有一個objects的類屬性,由django字段生成
E:查詢數據庫的數據或對數據進行操做處理


U:objects中的方法:
mysql

objects管理器中的方法 返回類型 做用
模型類.objects.get() 模型對象 返回一個對象,且只能有一個: 若是查到多條數據,則報:MultipleObjectsReturned 若是查詢不到數據,則報:DoesNotExist
模型類.objects.filter() QuerySet 返回知足條件的對象
模型類.objects.all() QuerySet 返回全部的對象
模型類.objects.exclude() QuerySet 返回不滿條件的對象
模型類.objects.order_by() QuerySet 對查詢結果集進行排序
模型類.objects.aggregate() 字典,例如:{'salary__avg': 9500.0} 進行聚合操做 Sum, Count, Max, Min, Avg
模型類.objects.count() 數字 返回查詢集中對象的數目



filter方法
D:模型管理器objects的一種查詢方法
E:實現條件查詢,返回QuerySet對象,包含了所知足條件的數據
U:模型類.objects.filter(模型類屬性名__條件名 = 值)
filter條件:
git

條件 含義 註釋
exact 判等 能夠省略
contains; endswith; startswith 模糊查詢 包含; 以什麼開頭; 結尾
isnull 空查詢 是否爲空,是返回True,否返回False
in 範圍查詢 在....內
gt,lt,gte,lte 比較查詢 大於,小於,大於等於,小於等於
year, date 日期查詢 年,日期



查詢的其餘方式
sql

方法 做用 示例
F對象 引用某字段的值,對比表中的兩個字段 查詢語文分數大於數學分數的學生 成績表.objects.filter(語文__gt=F('數學'))
Q對象 組合多個查詢條件,經過(&,|,~)進行邏輯操做 Q(條件1)邏輯操做符 Q(條件2) 
order_by 對查詢結果進行排序(默認升序) 升序: 模型類.objects.order_by('字段名') 降序: 模型類.objects.order_by('-字段名')
aggregate 聚合操做,對多行查詢結果中的一列進行操做,返回一個值。(有Sum,Count,Max,Min,Avg) 模型類.objects.aggregate(聚合類('模型屬性')) 返回值是一個字典,格式: {'屬性名__聚合函數': 值}
count 統計知足條件的對象的個數,返回值是一個數字 模型類.objects.count()



查看orm語句
shell

打開mysqld.cnf sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
重啓mysql服務 sudo service mysql restart
查看mysql日誌內容 sudo tail -f /var/log/mysql/mysql.log



QuerySet查詢集
D:調用模型管理器的all, filter, exclude, order_by方法會產生一個QuerySet
E:先過濾獲得該查詢集還能夠調用objects的方法操做數據
U:①取下標操做(下標不容許負數):b[0]取出QuerySet的第一條數據,若是不存在則                
    拋異常
    ②切片操做(下標不容許負數):產生新的QuerySet
    ③get():取出QuerySet的惟一一條數據,不存在或者多條則拋異常
    ④exsit():判斷是否有數據
    ⑤改,刪數據庫數據:QuerySet對象.update(屬性1=值1),QuerySet.delete()
特性:①惰性查詢:只有在使用QuerySet中的數據時,纔會取查詢數據庫中的數據
        ②緩存:第一次遍歷QuerySet中的全部對象,django會把數據緩存起來,第二次再使用時會使                
        用緩存,不會再次查詢。

一對多關聯查詢
由一類的條件查詢多類數據
1.   一類對象 = 一類類名.objects.get(條件)
    一類對象.多類類名小寫_set.all()
2.  多類類名.objects.filter(一類類名小寫__一類屬性名__條件 = 值)

由多類的條件查詢一類數據
1.   多類對象 = 多類類名.objects.get(條件)
    多類對象.關聯屬性
2.   一類類名.objects.filter(多類類名小寫__多類屬性名__條件 =值 )

自關聯
D:是一種特殊的一對多關係
U:自關聯關聯屬性定義:關聯屬性 = models.ForeignKey('self')

自定義模型管理器
D:在模型類中自定義模型管理器,自定義後,Django將再也不生成默認的objects
E: 功能1:修改管理器返回的原始查詢集
    功能2:在管理器類中添加額外的方法,幫助咱們操做模型類對應的數據表,減輕視
                    圖函數中的代碼量,主要作邏輯處理。
U:①在views建立一個自定義模型管理器類,繼承Manager
    ②重寫父類的方法修改管理器返回的原始查詢集
    ③把操做數據庫的代碼實現封裝到模型管理器的方法中,返回模型類對象
    ④在原模型類中:objects=自定義模型管理器類名()    實現功能1
    ⑤在視圖函數中調用objects.③的方法名()   可實現功能2
數據庫

相關文章
相關標籤/搜索