Python Day 58 Django框架、路由系统、视图函数、Django框架ORM框架(单表操作、一对多表、正反查询、双下划线方法)

  ##Django框架路由系统

11、伪静态 2 cnblogs:网站中的地址: 3 https://www.cnblogs.c om/linhaifeng/articles/7133167.html 4 自己项目中的访问地址: 5 http://127.0.0.1:8000/up_studnet/?id=12 6 7 如何实现? 8 路由分发 9#2、路由分发 10 url: 11 url(r'^index/(\w+)/(\w+)/', index), 12 url(r'^test/(?P<id>\w+)/(?P<name>\w+)/', test), 13 对应函数: 14 def index(request, name, id): 15 print(id , name) 16 return HttpResponse('index') 17 def test(request, name, id): 18 print(id , name) 19 return HttpResponse('test') 20 21 出现问题: 22 1、index函数:在web端访问: 23 http://127.0.0.1:8000/index/18/icon 24 http://127.0.0.1:8000/index/icon/18 25 会导致后台接收的id和name参数会随之变化 26 解决方案: 27 1、test函数:使用正则,然后起别名方式可以解决该问题 28#3、路由正则 29 url(r'^test2/$', test2) 30 思路:使用正则,当出现访问的地址不存在时,返回浏览器自定义的not fund错误 31 url(r'^', notfound) 需要写到最下面 32#4、反向路由: 33优点: 34 设置反向路由以后,只需要修改后台连接地址就可以,无需要动前端代码 35后台url: 36url(r'^logindjsajdbjsabdsabdbsabdhsabdhbsahbdsaasa/$', login, name='xxx') 37 xxx为自定义 38 39前台: 40<form action="{% url 'xxx' %}"> 41 <input type="text"> 42</form>反向解析(带参数的)  url(r'^indexxasdaskkdjlksajdlksaj/(\d+)/', index,name='index'),  有名无名均按照下面方式使用即可:    前端:{% url 'index' 1 %}  后端:reverse('index',args=(1,))  43 44#5、django创建app 45python3 manage.py startapp 自定义app名称 46 47在settings.py配置文件中添加app02使其生效 48INSTALLED_APPS = [ 49 'django.contrib.admin', 50 'django.contrib.auth', 51 'django.contrib.contenttypes', 52 'django.contrib.sessions', 53 'django.contrib.messages', 54 'django.contrib.staticfiles', 55 ‘app02’, 56] 57 58app02参数介绍: 59 admin.py : 写和django-admin相关的配置 60 apps: 对app的配置 61 models: 数据表模型 (********62 tests: 测试 63 views: 视图函数 (*******64 65#6、路由分组 66浏览器访问:127.0.0.18000/app02/teachers 67总:项目中urls.py; 68 先导入include 69 from django.conf.urls import url,include 70 在路由分发中添加 71 url(r'^app02/', include('app02.urls')), 72 url(r'^app03/', include('app03.urls')), 73 74分:app02中urls.py: 75 76 from app03 import views 77 78 urlpatterns = [ 79 80 url(r'^students/', views.studnets) 81 ] 82建议 大家使用:  创建一个app, 然后在app的views.py中写自己的业务逻辑函数, urls.py 路由匹配, 只是进行分发 83

   ##Django框架视图函数

  我们之前写过的都是基于函数的view,就叫FBV。还可以把view写成基于类的。

  就拿我们之前写过的添加班级为例:

1#1FBV:函数视图 2 3 function based view  # FBV版添加班级  def add_class(request):      if request.method == "POST":          class_name = request.POST.get("class_name")          models.Classes.objects.create(name=class_name)          return redirect("/class_list/")      return render(request, "add_class.html") 4#2CBV:类视图 5 class based view 6 7 总:项目中urls 8 urlpatterns = [ 9 url(r'^app03/',include('app03.urls')), 10 ] 11 分:app03中urls 12 from app03 import views 13 14 urlpatterns = [ 15 url(r'^login/',views.Login.as_view()), 16 17 ] 18 分:app03中视图函数views 19 from django.views import View 20 21 class Login(View): 22 def get(self,request): 23 return render(request,'login.html') 24 def post(self,request): 25 uname = request.POST.get('username') 26 print(uname) 27 return HttpResponse('ok') 28 分:templates目录下login.html 29 <!DOCTYPE html> 30 <html lang="en"> 31 <head> 32 <meta charset="UTF-8"> 33 <title>Title</title> 34 </head> 35 <body> 36 <form action="/app03/login/" method="post"> 37 <input type="text" name="username"> 38 <input type="submit" value="tijiao"> 39 </form> 40 </body> 41 </html> 42 浏览器:http://127.0.0.1:8000/app03/login/ 43 get请求找类中get方法 44 post请求找类中post方法

  注意:

1  使用CBV时,urls.py中也做对应的修改: 2 3  # urls.py中  url(r'^add_class/$', views.AddClass.as_view()),#3、给视图加装饰器  FBV本身就是一个函数,所以和给普通的函数加装饰器无差:  类中的方法与独立函数不完全相同,因此不能直接将函数装饰器应用于类中的方法 ,我们需要先将其转换为方法装饰器。  Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器。  如:    # CBV版添加班级    from django.views import View    from django.utils.decorators import method_decorator    class AddClass(View):        @method_decorator(wrapper)        def get(self, request):            return render(request, "add_class.html")        def post(self, request):            class_name = request.POST.get("class_name")            models.Classes.objects.create(name=class_name)            return redirect("/class_list/")  4 5#4、参数介绍 6 'get': 请求数据 7 'post':提交数据 8 'delete': 删除数据 9 'put': 更新数据 10 'patch': 更新部分数据 11 12 ps: 13 form表单提交 只支持get、post 14 ajax支持多个 15 16 核心: 17 def dispatch(self, request, *args, **kwargs): 18 super(Login, self).dispatch(request, *args, **kwargs) 19 dispatch方法:自定制的预处理操作:如权限管理,对登录时可以做一些预处理操作

   ##Django框架ORM

1#ORM配置 2""" 31、创建数据库 42、配置mysql的数据库链接 5 setting文件里的DATABASES设置为 6 DATABASES = { 7 'default': { 8 'ENGINE': 'django.db.backends.mysql', 9 'NAME': 's8day61', ## 数据库名称 10 'USER': 'root', 11 'PASSWORD': '123', ## 安装 mysql 数据库时,输入的 root 用户的密码 12 'HOST': '127.0.0.1', 13 } 143、注册app 15 也是在settings文件中的INSTALLED_APPS 16 把你的app文件名加进去 174、需要把mysqldb设置为pymysql链接 18 python3中用的是pymysql 19 python2中使用的是mysqldb 20 21 为了兼容,都改成pymysql 22 app下的__init__文件 23 import pymysql 24 pymysql.install_as_MySQLdb() 255、创建表(2个命令) 26 27 python manage.py makemigrations ## 生成migrations文件 28 29 python manage.py migrate ### 根据生成的migrations文件生成表 30 31""" 32 33#案例:在app03中models.py建立模型表 34from django.db import models 35 36# Create your models here. 37class Department(models.Model): 38 # 主键id 在django中会帮我们创建,所以可以省略id字段 39 title = models.CharField(max_length=32,null=True) 40 41class Userinfo(models.Model): 42 id = models.AutoField(primary_key=True) 43 name = models.CharField(max_length=32,null=True) 44 age = models.CharField(max_length=32,null=True) 45 email = models.CharField(max_length=32,default="") 46 # 默认会创建外键字段,字段名ud_id 回家一个_id 47 ud = models.ForeignKey("Department",null=True) 48 49 50#注意 51模型表中的字段增删改查都需要刷新上述两个命令 52python3 manage.py makemigrations 53python3 manage.py migrate 54 55#单表的增删改查 56 57# 先导入models文件 58from class_app import models 59 ### 增加 60# models.Department.objects.create(title="保安部") 61# models.Department.objects.create(title="开发部") 62 63### 查询 64### 查询所有 ==> 列表里套对象 65# res = models.Department.objects.all() 66### <QuerySet [<Department: Department object>, <Department: Department object>]> 67# for row in res: 68# print(row.id, row.title) 69 70### 指定字段查询 values ==> 列表里套字典 71### select title from department ; 72# res = models.Department.objects.values("title").all() 73# ### <QuerySet [{'title': '保安部'}, {'title': '开发部'}, {'title': '开发部'}]> 74# for row in res: 75# print(row['title']) 76 77### 指定字段查询 value_list==> 列表里套元组 78# res = models.Department.objects.values_list("title").all() 79# ### <QuerySet [('保安部',), ('开发部',), ('开发部',)]> 80# print(res) 81 82### select * from xxx where title = "开发部" 过滤 83# res = models.Department.objects.filter(title='开发部').all() 84# 85# print(res) 86# res = models.Department.objects.filter(id__lt = 3) ### less then 小于 87# res = models.Department.objects.filter(id__gt = 3) ### greater then 大于 88## 取第一条数据 89# res = models.Department.objects.all().first() 90# print(res) 91# 删 92models.Classes.objects.filter(name="xxx").delete() 93 94# 改 95models.Classes.objects.filter(name="xxx").update(name="ooo") 96# 如果需要改的值很多,并且在一个字典里,也可以用**打散 97models.Classes.objects.filter(name="xxx").update(**dic) 98 99#一对多表 100   ### 增加 101 # models.UserInfo.objects.create(uname = "icon", age=15, email="dddd@qq.com", ud_id=2) 102 # models.UserInfo.objects.create(uname = "创彬", age=16, email="gggg@qq.com", ud_id=2) 103 # models.UserInfo.objects.create(uname = "owen", age=18, email="hhhh@qq.com", ud_id=1) 104 105 # info = {"uname":'zekai2', 'age':13, "email":'123@qq.com', "ud_id":2} 106 # models.UserInfo.objects.create(**info) 107 108 109 ### 查询 110 ### 正向查询 111 # res = models.UserInfo.objects.all() 112 # for row in res: 113 # print(row.id, row.uname, row.age, row.ud.title) 114 115 ### 反向查询 116 ### 写法: 小写的表名_set.all() 117 # res = models.Department.objects.all() 118 # for row in res: 119 # print(row.title, row.userinfo_set.all()) 120 121 122 ### 神奇的双下画线 123 res = models.UserInfo.objects.values('id', 'uname', "ud__title").all() 124 print(res) 125 126 res = models.UserInfo.objects.values_list('id', 'uname', "ud__title").all() 127 print(res) 128 129#django中orm的表的正查与反差 130 131# 如果一张表和其他的表建有外键关系,那么从这张表查另一张表称为正查,反之称为反差 132# 先建立两个外键关系的表 133class Classes(models.Model): # 如果我们不设置一张表的id时,django会自动帮我创建一个自增的主键id 134 name = models.CharField(max_length=32,null=True) 135 136class Students(models.Model): 137 name = models.CharField(max_length=32,null=True) 138 cid = models.ForeignKey("Classes",null=True) # 会自动帮我们和另一张表的主键建立外键关系 139 140# 正查 141for obj in students: 142 print(obj.cid.name) # 可以直接通过对象点里面的属性就可以点出另一个类的对象,可以继续取值 143 144# 反查 145obj.student_set.all() # 就是查出所有的对象 146 147# 还可以通过下划线直接取到另一张表的值 148# values是取出括号里对应的值,通过列表里套字典的形式 149# values_list 是取出括号里对应的值, 通过列表里套元组的形式 150models.Classes.objects.values("id","name","cid__name").all() 151 152#双下划线 153# 查询时通过外键名__另一张表的名字 可以查到关联表的值 154# eg: 155models.Classes.objects.values("id","name","cid__name").all() #这个cid__name可以查询到关联表对应的name 156# 查询时可以在filter中加入限制条件 __lt 代表小于 __gt代表大于 157# eg: 158models.Classes.objects.filter(id__lt = 3).all() # id < 3 159models.Classes.objects.filter(id__gte = 3).all() # id >= 3
点赞
收藏

评论区

加载中...

相关推荐

Django的安装与简易使用

Django的安装与简易使用1.Django的简介Django是有Python编写的一个开源代码Web应用框架(网址:https://github.com/django/django)。他是基于MTV模式,其本质与MVC是一样的。具体是:1.M代表模型(Model):负责业务对象和数据库的关系映射(ORM)2.T代表模板(Template):负责

9 MySQL

多表查询:http://www.cnblogs.com/linhaifeng/articles/7267596.html1.多表连接查询2.符合条件连接查询3.子查询一、准备表!(https://oscimg.oschina.net/oscnet/3ed677

Python接口自动化(二)接口开发

django配置开发环境相关命令pythonmanage.pyrunserver127.0.0.1:8000在指定的地址和端口启动服务pythonmanage.pystartappapi生成django项目

Django框架

django框架第一篇:Django简介(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2FDominicJi%2Farticles%2F10982272.html)第二篇:路由控制(https://www.oschi

Django简介及Django项目的创建详述

Django简介Django是一个开源的Web应用框架,由Python写成。但是,百度百科中讲它采用了MVC框架模式,其实这个解释不准确。确切的讲,Django的模式是:路由控制MTV模式。所谓的路由控制其实就是采用URL分发器,将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template。

Django基础——Django路由系统

Django路由系统(详情点我):路由系统的本质就是url的路径与路径相对于的函数之间的映射关系;(路径和函数之间的对应关系)Django1.1版本fromdjango.conf.urlsimporturl引入Appfromapp01importviewsfromdjan