1 1.經常使用字段 2 AutoField() int primary key auto_increment 3 CharField() varchar() 4 IntegerField() int() 5 big .... 自增列() 6 EmailField() varchar(254) 7 DateField() date 8 9 DateTimeField() datetime 10 auto_now: 每次數據都會更新數據 11 auto_now_add: 只在第一次建立數據的時候纔會更新一次 12 13 BooleanField(Field) 14 is_delete = BooleanField() 15 給該字段傳值的時候,你只須要傳佈爾值便可 16 可是對應到數據庫 它存在的是0和1 17 18 TextField(Field) 19 - 文本類型 20 用來存大段文本 21 22 FileField(Field) 23 - 字符串 , 路徑保存在數據庫,文件上傳到指定目錄 24 25 - 參數: 26 update_to = "" 27 用戶上傳的文件會自動放到等號後面指定的文件路徑中 28 storage = None 29 存儲組件,默認django.core.files.storage.FileSystemStorage 30 31 關係字段 32 ForeignKey 33 外鍵類型在ORM中用來表示外鍵關聯關係,通常把ForeignKey字段設置在 '一對多'中'多'的一方。 34 35 ForeignKey能夠和其餘表作關聯關係同時也能夠和自身作關聯關係。 36 37 38 外鍵字段 : 39 oneToOne 40 ForeignKey 41 ManyToMany 42 to 標識 表關係 43 null 44 default 45 primary key,unique db_index 46 當你在使用django2.X版本的時候 在創建外鍵關係時(*****) 47 須要你手動添加幾個關鍵點參數 48 models.cascade 49 db constraints 50 51 52 ps: 53 1.models 中全部的字段類型都沒有實際的約束做用 54 2.可是雖然寫在models中沒有限制做用 ,可是他們對於校驗性組件是很是有用的
1 2.自定義char字段 2 class MyChar(models.Filed): 3 def __init__(self,max_length,*args,**kwargs): 4 self.max_length = max_length 5 super()__init__(max_length=max_length,*args,**kwargs) 6 7 def db_type(self,connection): 8 return 'char(%s)'%self.max_length 9 10 11 # 使用: 12 class User(models.Model) 13 username = MyCharField(max_length=32)
1 3.數據庫查詢優化: 2 ps:orm 內全部的語句操做都是惰性查詢: 只會在你真正須要數據的時候 纔會走數據庫,若是你單單隻寫orm語句時不會走數據庫的 3 這樣設計的好處 在於減輕數據庫的壓力 4 5 1.only與defer 6 # res = models.Book.objects.only('title') 7 # # print(res) 8 # for r in res: 9 # # print(r.title) # 只走一次數據庫查詢 10 # print(r.price) # 當你點擊一個不是only括號內指定的字段的時候 不會報錯 而是會頻繁的走數據庫查詢 11 12 # res1 = models.Book.objects.defer('title') # defer與only是相反的 13 # for r in res1: # defer會將不是括號內的全部的字段信息 所有查詢出來封裝對象中 14 # # 一旦你點擊了括號內的字段 那麼會頻繁的走數據庫查詢 15 # print(r.price) 16 2.select_related 與 prefrect_related 17 select_related 幫你直接進行連表操做 查詢數據 括號裏只能放外鍵字段 18 # res = models.Book.objects.all().select_related('publish') 19 # for r in res: 20 # print(r.publish.name) 21 # res = models.Book.objects.all().select_related('publish__xxx__yyy__ttt') 22 # print(res) 23 # res = models.Book.objects.all() 24 """ 25 select_related:會將括號內外鍵字段所關聯的那張表 直接所有拿過來(能夠一次性拿多張表)跟當前表進行拼接操做 26 做用:從而下降你跨表查詢 數據庫的壓力 27 28 注意select_related括號只能放外鍵字段 一對一 或 一對多 29 res = models.Book.objects.all().select_related('外鍵字段1__外鍵字段2__外鍵字段3__外鍵字段4') 30 """ 31 32 prefetch_related 不主動連表 33 34 res = models.Book.objects.prefetch_related('publish') 35 """ 36 不主動連表操做 (但內部給的感受像是連表操做) 而是將book表中publish所有拿出來 再取publish表中將id 對應的全部的數據取出 37 res = models.Book.objects.prefetch_related('publish') 38 括號內有幾個外鍵字段 就會走幾回數據庫查詢操做 39 40 """ 41 for r in res: 42 print(r.publish.name) 43 44 45 """數據庫查詢優化 : 面試重點""" 46 """only""" 47 # res = models.Book.objects.only('title') 48 # for r in res: 49 # # print(r.price) # 頻繁走數據庫 50 # print(r.title) # 只走一次 51 """defer""" 52 # res = models.Book.objects.defer('title') # 把它對應信息封裝到一個表中, 53 # for r in res: 54 # # print(r.price) # 只查詢一次 55 # print(r.title) # 重複查詢數據庫 56 57 """select_related and drefetch_related""" 58 """select_related() 跨表查詢 只查詢一次 59 內部原理: 會將括號內 60 主要針對:一對一 一對多 關係 61 """ 62 # res = models.Book.objects.all() # 重複查詢數據庫 63 # res = models.Book.objects.all().select_related() 64 # res = models.Book.objects.all().select_related('publish') # 只查一次 65 # print(res) 66 # for r in res: 67 # print(r.publish.name) 68 """prefetch_related 不主動連表(內部感受像連表) 69 內部操做: 子查詢 70 71 """ 72 # res = models.Book.objects.prefetch_related('publish') 73 # # print(res) 74 # for r in res: 75 # print(r.publish.name)
1 4.事務 2 ACID 3 原子性 4 一致性 5 隔離性 6 持久性 7 from django.db import transaction 8 with transaction.atomic(): 9 """ 10 數據庫操做 11 在該代碼中書寫的操做 同屬於一個事物 12 """ 13 models.Book.objects.create() 14 models.Publish.objects.create() 15 16 # 添加書籍和出版社 17 就是同一個事務 要麼一塊兒成功 要麼一塊兒失敗 18 print('出了 代碼塊 事務就結束了') 19 20 例: 21 from django.db import transction 22 try: 23 # 開啓事務 24 with transction.automic(): 25 except BaseException as e: 26 # 事務結束 27 print(e) 28 # 正常代碼
1 圖書管理系統 2 書籍的增刪改查 3 4 前端業務無關緊要 5 可是後端必需要有!!! 6 7 8 9 """做業 刪除數據時讓用戶作二次確認""" 10 11 models 建表 12 setting 聯建數據庫 13 同步連表 14 urls 路由層 15 views 視圖 16 templates 前端展現
1 上週內容回顧 2 經常使用字段 3 DateField 4 DateTiemField 5 auto_now 6 auto_now_add 7 8 EmailField 9 10 CharField 11 12 IntegerField 13 14 AutoField 15 primary_key = True 16 17 18 null 19 default 20 21 22 OneToOne 23 ForeignKey 24 ManyToMany 25 to 26 27 28 29 30 31 32 models中全部的字段類型都沒有實際的約束做用 33 可是雖然寫在models中沒有限制做用,可是它們對於校驗性組件 34 是很是有用的 35 36 37 38 自定義char字段 39 class MyCharField(models.Field): 40 def __init__(self,max_length,*args,**kwargs) 41 self.max_length = max_length 42 super().__init__(max_length=max_length,*args,**kwargs) 43 44 def db_type(self,connection): 45 return 'char(%s)'%self.max_length 46 47 class User(models.Model): 48 username = MyCharField(max_length=32) 49 50 51 52 查詢優化(面試) 53 only('name') 54 defer('name') 55 這哥倆是一對相反的關係調用它們都能獲得一個套有對象的列表 56 57 58 select_related 59 內部自動連表而後操做 60 先將表拼接起來 61 而後一次性將拼接表的數據所有查出來給你封裝到對象中 62 63 prefetch_related 64 內部走了好幾回數據庫 65 66 事務 67 from django.db import transction 68 try: 69 with transction.automic(): 70 # 事務操做 71 except BaseException as e: 72 print(e) 73 # 正常代碼 74 75 76 圖書管理系統 77 增刪改查 78 79 80 今日內容 81 choices參數 82 83 用戶性別 84 用戶學歷 85 工做狀態 86 客戶來源 87 是否結婚 88 89 username gender 90 jason 1 91 92 93 94 MTV與MVC模型 95 django框架 自稱爲是MTV框架 96 M:models 97 T:templates 98 V:views 99 100 MVC 101 M:models 102 V:views 103 C:controller 控制器(urls) 104 本質:MTV其實也是MVC 105 106 107 108 109 110 111 112 113 Ajax 114 異步提交 局部刷新 115 請求方式 GET POST 116 a標籤href屬性 GET請求 117 瀏覽器窗口輸入url GET請求 118 form表單 GET/POST 119 ajax GET/POST 120 121 首先ajax這門技術 是js中的 122 可是原生的js操做ajax比較繁瑣,咱們這裏爲了提升效率 123 直接使用jQuery封裝版本的ajax 124 125 126 127 AJAX 最大的優勢是在不從新加載整個頁面的狀況下,能夠與服務器交換數據並更新部分網頁內容。 128 (這一特色給用戶的感覺是在不知不覺中完成請求和響應過程) 129 130 131 小例子 132 頁面上有三個input框 133 在前兩個input框中輸入數字 134 點擊按鈕 發送ajax請求 不刷新頁面的狀況下 135 第三個框中自動算出兩數之和 136 137 $('#b1').on('click',function () { 138 {#alert(123)#} 139 // 點擊按鈕 朝後端發送post請求 140 $.ajax({ 141 url:'', // 控制發送給誰 不寫就是朝當前地址提交 142 type:'post', // 發送方式是post請求 143 data:{'i1':$('#i1').val(),'i2':$('#i2').val()}, // 發送的數據 144 success:function (data) { // data形參用來接收異步提交的結果 145 {#alert(data)#} 146 // 將後端計算好的結果 經過DOM操做 渲染到第三個input礦中 147 $('#i3').val(data) 148 } 149 }) 150 }) 151 152 153 contentType先後端傳輸數據編碼格式 154 先後端傳輸數據編碼格式 155 1.urlencoded 156 2.formdata 157 3.json 158 159 form表單 160 默認使用的編碼格式是urlencoded 161 數據格式:name=jason&pwd=123 162 django後端針對urlencoded編碼格式的數據會自動解析並放到request.POST中供用戶獲取 163 164 能夠修改成formdata 傳文件 165 django後端針對只要是符合urlencoded編碼格式的數據(name=jason&pwd=123)都會自動解析並放到request.POST中供用戶獲取 166 若是是文件 只要你指定的編碼是formdata 就會自動解析並放到request.FILES中 167 總結:先後端傳輸數據的時候 必定要保證數據格式和你的編碼格式是一致的 不能騙人家!!! 168 169 ajax提交數據 170 ajax默認數據提交方式也是urlencoded 171 172 ajax發送json格式數據 173 django後端針對json格式的數據 並不會自動解析放到request.POST或者request.FILES裏面 174 它並不會解析json格式數據 而是將它原封不動的放在request.body中了 175 $('#b1').on('click',function () { 176 alert(123) 177 // 點擊按鈕 朝後端發送post請求 178 $.ajax({ 179 url:'', // 控制發送給誰 不寫就是朝當前地址提交 180 type:'post', // 發送方式是post請求 181 data:JSON.stringify({'username':'jason','password':123}), // 發送的數據 182 contentType:'application/json', // 告訴後端你此次的數據是json格式 183 184 success:function (data) { // data形參用來接收異步提交的結果 185 alert(data) 186 // 將後端計算好的結果 經過DOM操做 渲染到第三個input礦中 187 $('#i3').val(data) 188 } 189 190 }) 191 // {) 192 ajax傳輸文件 193 // ajax傳輸文件 194 $('#b1').on('click',function () { 195 // ajax傳輸文件 建議使用內置對象formdata 196 var formData = new FormData(); // 既能夠傳普通的鍵值對 也能夠傳文件 197 // 添加普通鍵值 198 formData.append('username','jason'); 199 formData.append('password','123'); 200 // 傳文件 201 // 如何獲取文件標籤所存儲的文件對象? 固定語法 202 // 1.先用jQery查找到存儲文件的input標籤 203 // 2.將jQuery對象轉成原生js對象 204 // 3.利用原生js對象的方法 .files[0]獲取到標籤內部存儲的文件對象 205 // 4.必定要指定兩個參數都爲false 206 formData.append('my_file',$('#d1')[0].files[0]); 207 $.ajax({ 208 url:'', // 控制發送給誰 不寫就是朝當前地址提交 209 type:'post', // 發送方式是post請求 210 data:formData, // 發送的數據 211 212 // ajax發送文件須要指定兩個額外的參數 213 processData:false, // 告訴前端不要處理數據 214 contentType:false, // 不適用任何編碼 由於formdata對象自身自帶編碼 django後端也可以識別formdata對象 215 216 success:function (data) { // data形參用來接收異步提交的結果 217 {#alert(data)#} 218 // 將後端計算好的結果 經過DOM操做 渲染到第三個input礦中 219 $('#i3').val(data) 220 } 221 222 }) 223 }) 224 225 226 227 序列化組件 228 229 from django.core import serializers # django自帶的一個小型的序列化工具 230 def reg(request): 231 user_list = models.User.objects.all() 232 res = serializers.serialize('json',user_list) 233 return render(request,'index.html',locals()) 234 235 [{ 236 "model": "app01.user", 237 "pk": 1, 238 "fields": { 239 "username": "jason", 240 "age": 18, 241 "gender": 1 242 } 243 }, { 244 "model": "app01.user", 245 "pk": 2, 246 "fields": { 247 "username": "tank", 248 "age": 24, 249 "gender": 3 250 } 251 }, { 252 "model": "app01.user", 253 "pk": 3, 254 "fields": { 255 "username": "egon", 256 "age": 73, 257 "gender": 2 258 } 259 }, { 260 "model": "app01.user", 261 "pk": 7, 262 "fields": { 263 "username": "kevin", 264 "age": 29, 265 "gender": 4 266 } 267 }] 268 269 270 271 sweetalert搭建頁面 272 273 自定義分頁器 274 1 bulk_create() 批量插入數據 275 # for i in range(1000): 276 # models.Book.objects.create(title='第%s本書'%i) 277 # 上面這種方式 效率極低 278 279 l = [] 280 for i in range(10000): 281 l.append(models.Book(title='第%s本書'%i)) 282 models.Book.objects.bulk_create(l) # 批量插入數據 283 284 285 自定義分頁器的使用 286 後端代碼 287 book_list = models.Book.objects.all() 288 current_page = request.GET.get("page",1) 289 all_count = book_list.count() 290 page_obj = Pagination(current_page=current_page,all_count=all_count,per_page_num=10,pager_count=5) 291 page_queryset = book_list[page_obj.start:page_obj.end] 292 前端代碼 293 {% for book in page_queryset %} 294 <p>{{ book.title }}</p> 295 {% endfor %} 296 {{ page_obj.page_html|safe }} 297 298 299 300 多對多表關係 三種建立方式 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363