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數據庫