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

猜你喜欢

转载自www.cnblogs.com/llx--20190411/p/11582334.html