Python Web 框架-Django day04
day03
1.模板的繼承 1.父模板 {% block 名稱 %} {% endblock %} 2.子模板 1.指定繼承模板 {% extends '父模板名稱' %} 2.編寫要覆蓋的內容 {% block 名稱 %} {% endblock %} 2.url() 的name屬性 - 反向解析 1.為 url 的name屬性賦值 url(r'',views,name='名稱') 1.模板中反向解析 {% url 'name值' '引數1' '引數3' %} 2.檢視中反向解析 url=reverse('name值',args=('引數1','引數2')) 3.建立模型 class ClassName(models.Model): 屬性名=models.欄位型別(欄位選項)
欄位型別: 1.CharField(max_length=50) 2.IntegerField() 3.FloatField() 4.DecimalField(max_digits=7,decimal_places=2) 5.EmailField() 6.URLField() 7.ImageField() 8.DateField() 9.DateTimeField() 10.BooleanField() 欄位選項: 1.default 2.null 3.db_column 4.相關指令 1.版本切換 ./manage.py migrate 應用名稱 版本號 2.通過資料庫自動匯出models類 ./manage.py inspectdb > 檔名.py
1模型中的CRUD
- 增加資料
- Entry.objects.create(屬性=值,屬性=值) 返回值:建立好的實體物件
- 建立一個Entry 物件,並通過 save() 進行儲存 obj = Entry(屬性=值,屬性=值) obj.屬性 = 值 obj.save() 無返回值,儲存成功後,obj 會被重新賦值
- 使用字典建立物件,並通過 save() 進行儲存 dic = { '屬性1':'值1', '屬性2':'值2', } obj = Entry(**dic) obj.save() 練習: 使用插入資料的三種實現方式,分別向Book,Publisher 三個實體表中各增加三條資料
- 查詢資料(重難點)
通過 Entry.objects 呼叫查詢介面函式
ex:
Entry.objects.filter()
Entry.objects.exclude()
所有的查詢介面函式,都可以通過一個query 屬性來得到對應的sql語句
Entry.objects.filter().query
- 基本查詢操作 語法:all() 用法:Entry.objects.all() 返回:QuerySet(查詢結果集,是一個封裝了若干物件的列表)
- 查詢返回指定列 語法:values() | values('列1','列2',...) 作用:查詢一個QuerySet中的部分列,並封裝成字典,再放到列表中 用法: Entry.object.values() Entry.object.values('列1','列2') 也允許將values() 放在其他返回查詢結果集的方法的後面 Entry.objects.all().values() Entry.objects.filter.values()
- 查詢返回指定列 語法:values_list() 作用:將結果封裝到元組中再封裝到列表中 用法:同values 練習: 效果:查詢Author表中所有的資料顯示在網頁上 姓名 年齡 郵箱 操作 王老師 32 [email protected] 刪除 修改
- 只查詢一條資料 語法:get(條件) 作用:查詢只返回一條資料 用法:Entry.objects.get(條件) 注意: 該方法只能查詢一條資料 查詢多於一條資料或沒查詢出結果的話那麼都會拋異常
- 根據條件查詢部分行資料
語法:filter(條件)
用法:Entry.objects.filter(條件)
ex:
- 想查詢id為1的Author的資訊 Author.objects.filter(id=1)
- 想查id為1,並且name為隔壁老王的資訊
Author.objects.filter(id=1,name='隔壁老王')
注意:
- 多條件,用,隔開即可
- 用,隔開的條件,對映到sql中是用 and 來連線的
- 想查詢age 大於等於 30 的 author 的資訊
Author.objects.filter(age>=30) #錯誤
在條件查詢中,Django提供了若干查詢謂詞(Field Looups),可以完成非等值條件的查詢
Entry.objects.filter(屬性_查詢謂詞=值)
所有支援條件查詢的位置處都支援查詢謂詞:
filter(),get(),exclude()
練習:
- 查詢出age大於等於30的Author的資訊 authors = Authors.objects.filter(age__gte=30)
- 查詢出所有姓‘王’的Author的資訊 authors = Authors.objects.filter(name__startswith='王')
- 查詢出所有email中包含‘wang’的Author的資訊 authors = Authors.objects.filter(emial__contains='wang')
- 對條件取反 語法:exclude(條件) 用法:Entry.objects.exclude(條件) ex: Author.objects.exclude(id=1) select * from index_author where not(id=1) Author.objects.exclude(id=1,age__lt=30) select * from index_author where not (id=1 and age < 30)
- 聚合查詢(不帶分組)
語法:aggregate()
語法:
Entry.objects.all().aggregate(名=聚合函式('列'))
ex:
Author.objects.all().aggregate(avg=Avg('age'))
聚合函式:
- Avg():平均值
- Count():數量
- Sum():求和
- Min():最小值
- Max():最大值
- 聚合查詢(帶分組) 語法:annotate() 用法:Entry.objects.all().values('列1','列2').annotate(列=聚合函式()).values('列1','列2') ex: result = Author.objects.values('isActive').annotate(sum=Sum('age')).all()
- 排序查詢 語法:order_by() 用法:Entry.objects.order_by('列1','-列2') 預設是升序排序,列名前加 - 則表示降序排序
- 修改
- 修改單個實體
- 查 通過get() 得到要修改的實體物件 ex: au = Author.objects.get(id=2)
- 改 通過物件的屬性修改物件的值 ex: au.age = 38 au.email = '[email protected]' au.isActive = False
- 儲存 通過物件的save() 儲存回資料庫 ex: au.save()
- 批量修改資料 呼叫QuerySet 的 update(屬性=值,屬性=值)實現批量修改 ex: Author.objects.filter(isActive=False).update(isActive=True)
- 修改單個實體
- 刪除
呼叫實體物件/查詢結果集的 delete() 完成刪除
- 刪除單個物件 au = Author.objects.get(id=1) au.delete
- 刪除多個物件 ex:刪除Author 表中isActive的值為False的所有資料 auList = Author.objects.filter(isActive=False) auList.delete
示例 請點選
kxdi