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