笔记总结
1.常用字段
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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中没有限制作用 ,但是他们对于校验性组件是非常有用的
2.自定义字段
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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)
3.数据库优化查询 面试
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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.事务
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 # 正常代码
5.作业 图书管理系统
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 图书管理系统 2 书籍的增删改查 3 4 前端业务可有可无 5 但是后端必须要有!!! 6 7 8 9 """作业 删除数据时让用户做二次确认""" 10 11 models 建表 12 setting 联建数据库 13 同步连表 14 urls 路由层 15 views 视图 16 templates 前端展示
re
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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