1.經常使用字段2自定義字段3數據庫查詢優化4事務5圖書管理系統講解#56

筆記總結
1.經常使用字段

 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中沒有限制做用 ,可是他們對於校驗性組件是很是有用的
View Code

 


2.自定義字段

 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)
View Code

 


3.數據庫優化查詢 面試

 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)
數據庫優化查詢

 


4.事務

 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     # 正常代碼
View Code

 


5.做業 圖書管理系統

 1 圖書管理系統
 2 書籍的增刪改查
 3 
 4 前端業務無關緊要
 5 可是後端必需要有!!!
 6 
 7 
 8 
 9 """做業 刪除數據時讓用戶作二次確認"""
10 
11 models 建表
12 setting 聯建數據庫
13 同步連表
14 urls 路由層
15 views 視圖
16 templates 前端展現
View Code

 


re

  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     
View Code
相關文章
相關標籤/搜索