Django数据操作、ORM表设计、路由层
2019-10-23 17:13 在上海的日子里 阅读(205) 评论(0) 编辑 收藏 举报目 录
-
数据的编辑和删除
-
ORM创建表关系(以图书管理系统为例)
-
Django请求生命周期
-
路由层
-
-
路由匹配、有名分组/无名分组 、反向解析、路由分发、名称空间
-
-
-
伪静态
-
虚拟环境
-
Django 1.x 和Django 2.x 的区别
前言:
以下只是理论知识点及重点代码展示,详细案例及代码待补充
一、数据的编辑和删除
查询数据 get() filter() all() 创建数据 create() user_obj = models.Userinfo(**kwargs) user_obj.save() 数据的编辑与删除 后端如何获取前端用户想要编辑的数据对象 1.利用get请求url后面可以携带参数的方式 将数据的主键值传递给后端 编辑功能的思路:获取用户想要编辑的数据对象 展示到前端页面 用户修改之后点击修改 再去修改数据库中对应的数据 1.方式1 modeles.Userinfo.objects.filter(**kwargs).update() # 批量更新 2.方式2 (不推荐使用 效率极低 会将每一个字段对应的值全部重写一遍) edit_obj = models.Userinfo.objects.filter(pk=edit_id).first() # pk会自动帮你查找当前表的主键字段 edit_obj.username = username edit_obj.password = password edit_obj.save() 删除 models.Userinfo.objects.filter(pk=delete_id).delete() """说真正的数据是不会被删除的 通常都是给数据设置一个是否删除的标志位"""
二、ORM创建表关系(以图书管理系统为例)
图书管理系统表设计(orm如何创建表与表之间的关系) 一对多 一对多外键字段应该建在多的那一方 models.ForeignKey(to='关联的表名') # 自动建关系 默认就是跟关联表的主键字段 """ ForeginKey字段在创建的时候 orm会自动在字段后面加_id """ 多对多 ManyToManyField(to='关联的表名') # 并不会创建一个实际字段 仅仅是用来告诉django orm自动创建第三张表 一对一 OneToOneField(to='关联的表名') """ OneToOneField字段在创建的时候 orm会自动在字段后面加_id """
三、Django请求生命周期
四、路由层
路由层 路由匹配 url第一个参数是正则 无名分组 url(r'^index/(\d+)/',views.index) 在调用视图函数index的时候 会将\d+匹配到的内容 当做位置参数传递给index 有名分组 url(r'^index/(?P<year>\d+)/',views.index) 在调用视图函数index的时候 会将\d+匹配到的内容 当做关键字参数(year='')传递给index """注意 无名有名不能混合使用 但是可以单独使用 单独使用的时候支持多个""" 反向解析 本质:根据某一个东西得出一个结果 该结果可以直接访问到对应的url 没有正则表达式的反向解析 url(r'^index/',views.index,name='xxx') # 起别名 别名一定不要重复 前端反向解析 {% url 'xxx' %} 后端反向解析 from django.shortcuts import reverse url = reverse('xxx') 无名和有名分组的反向解析 url(r'^index/(\d+)/',views.index,name='xxx') 前端反向解析 {% url 'xxx' 123 %} 后端反向解析 from django.shortcuts import reverse url = reverse('xxx',args=(123,)) """个人建议:在处理容器类型数据的时候 无论有几个值 你最后都加一个逗号""" url(r'^index/(?P<year>\d+)/',views.index,name='xxx') 前端反向解析 {% url 'xxx' 123 %} {% url 'xxx' year=123 %} # 了解 后端反向解析 from django.shortcuts import reverse url = reverse('xxx',args=(123,)) url = reverse('xxx',kwargs={'year':123}) # 了解 """个人建议:在处理容器类型数据的时候 无论有几个值 你最后都加一个逗号"""
路由分发******
路由分发 django中的每一个app都可以有自己独立的static文件夹,templates文件夹,urls.py等 正是由于上述的特点 你基于django开发项目 就真正可以做到分组分功能分模块独立的去开发 当应用特别多的时候 总路由中的代码过于冗长 不好维护 # 1.在应用下自己手动创建urls.py # 2.在路由中导入 # 1 from app01 import urls as app01_urls from app02 import urls as app02_urls url(r'^app01/',include(app01_urls)), url(r'^app02/',include(app02_urls)) # 2 url(r'^app01/',include('app01.urls')), url(r'^app02/',include('app02.urls'))
名称空间
名称空间 url(r'^app01/',include('app01.urls',namespace='app01')), url(r'^app02/',include('app02.urls',namespace='app02')) # app01 urls.py url(r'^index/',views.index,name='index') # app02 urls.py url(r'^index/',views.index,name='index') url = reverse('app01:index') url = reverse('app02:index') {% url 'app01:index' %} {% url 'app02:index' %} # app01 urls.py url(r'^index/',views.index,name='app01_index') # app02 urls.py url(r'^index/',views.index,name='app02_index')
五、伪静态
url看起来像是一个静态页面(.html结尾)
六、虚拟环境
虚拟环境 不同的项目应该有各自独立的解释器环境 最大化节省资源 实际功能中针对不同的项目 会有一个叫requestsments.txt文件 该文件中列出来是一个个该项目需要用的到模块名和版本号 eg: django = 1.11.11 nginx = 1.21 后期通过命令直接会去下载该文件内所有的模块及对应版本 虚拟环境 就类似于是个python解释器环境 每创建一个就类似于重新下载了一个纯净的python解释器环境 建议 你的机器上不要有态多的虚拟环境 当前我们这个阶段 建议你所有的模块全部都安装在本机环境中
七、Django 1.x 和Django 2.x 的区别
django版本区别
url和path
path第一个参数不支持正则 写什么就匹配什么 精准匹配
re_path跟url是一模一样的用法
提供五个默认的转换器
还支持用户自定义转换器