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
相关文章
相关标签/搜索