☆Django☆---表的设计 生命周期 分组 解析 路由层 视图层

Posted lddragon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了☆Django☆---表的设计 生命周期 分组 解析 路由层 视图层相关的知识,希望对你有一定的参考价值。

图书管理系统的 表 设计

  图书管理系统分别有三张表 作者表 书籍表 出版社表  他们 的对应关系为

技术图片

 如何在 Django中建立表与表之间的关系?

  首先我们需要在 app文件里 的 models创建出 这三张表 然后做对应关系 

  复习Django的操作: 1.创建好app后需要 将app添加到INSTALLED_APP = [] 里面

  2.在Django中添加mysql数据库 >>>点击 侧边栏中的 database  >>>然后左上角的加号 >>> 点击 Data source (数据来源) >>>选择mysql

  3.在app文件 或者 Django文件下的 __init__文件里 导入 pymysql 文件  使用 pymysql.install_as_Mysqldb() 代码来指定使用的模块

  4.需要在配置文件里 修改 Django默认使用连接数据库的模块 改为 pymysql   在settings文件里找到 DATABASES 如图4修改:

技术图片

 

 技术图片

注意 需要 先下载她让下载的驱动(driver) 文件 然后选择 driver 5.1 启动就行了 

技术图片

 

 技术图片

 

 

# Create your models here.
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    price = models.IntegerField(null=True)
    # 多对多
    author = models.ManyToManyField(to=Author)
    publish = models.ForeignKey(to=Publish)

class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)

class Publish(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)

 

使用代码来创建表与表之间的关系 

     一对多 ForeignKey(to=‘Publish‘)
     一对一 OneToOneField(to=‘AuthorDetail‘)
  多对多 ManyToManyField(to=‘Author‘)

 技术图片

 

 技术图片

 

 

 最后强调! 只要牵扯到models及数据库操作字段 后 必须 要数据库 迁移

代码 python3 manage.py makemigrations

  python3 manage.py migrate

 Django请求生命周期图

技术图片

 

 技术图片

 

 路由层

技术图片

 

 我们会发现 在 urlpatterns (patterns 花样 模型 形态)中的 url(......,)   的第一个参数 是一个正则表达式 

且 先记住 在 浏览器 输入的 后缀 一旦匹配到了 内容 就不会 往下继续匹配 而是 直接执行相应的视图函数  好比如:

url(r^data/, 功能)
url(r^datasssss/, 功能) 他就会 直接执行 data相应的视图函数

 

斜杆

Django在路由匹配的时候  当你没有在 浏览器中敲最后的斜杆时 django会先拿着你没有敲斜杆的内容去匹配  如果没有 匹配上 会让浏览器 在末尾 添加斜杆后 再次发一次 请求在匹配 如果还是匹配不上的话就会报错!

技术图片

 

 如果你想取消该机制 不想做二次匹配的话  可以在 settings文件中指定 

APPEND_SLASH = False  # 默认参数是True     slash(斜线)

 技术图片

 

无名分组

url(r^test/([0-9]4)/, views.test)  0到9 4位

 

路由匹配的时候 会将括号内的正则表达式匹配到的内容 当做位置参数 传给 视图函数 这么说 的话 他的参数就不止request了

技术图片

 

 有名分组

url(r^test/(?P<year>\\d+)/, views.test) 

 

在括号内 ?p<  > 就是 起别名 

路由匹配的时候 会将括号内正则表达式匹配到的内容 当做关键字参数传递给视图函数

此时你的 位置参数就可以使用 他起的别名了

# 无名有名不能混合使用 !!!
url(r^test/(\\d+)/(?P<year>\\d+)/, views.test),

 

但是用一种分组下 可以使用多个
    # 无名分组支持多个
    # url(r^test/(\\d+)/(\\d+)/, views.test),
    # 有名分组支持多个
    # url(r^test/(?P<year>\\d+)/(?P<xx>\\d+)/, views.test),

这样的话 我们的关键字就有两个了

 

匹配主页

url(r^$,views.home)

 

反向解析

本质:本质其实就是 给你返回一个能够返回对应的 url的地址

1.我们需要给url 和 视图 函数起别名  例如

url(r^index/$,views.index,name=kkk)

 

2.反向解析 

  后端的反向解析

    后端可以在任意位置 通过reverse 方向解析出 对应的url  

            from django.shortcuts import render,HttpResponse,redirect,reverse  小白必回三板斧 后加入 reverser
            reverse(kkk)
        shortcuts(快捷方式)

  前端的反向解析

% url kkk %

 

应用场景 防止代码写死了 假如说你的html中的 a 标签 有1000个 指向 路由 /index/ 但是你的产品经理 突然说 你给老子 把 那个 url 的参数改了 那么这1000个a 标签就gg 了 我们 就可以先给 路由和视图函数起别名 标签  name=‘kkk‘

我们 前端页面中的a标签括号内使用 %url ‘kkk‘% 就可以反向解析到 你 url后缀了 就不怕你变了 同样 我们 还可以 在 后端 中使用 reverser(‘‘)内填写你起的别名 就可以反向解析到他的 url了

无名分组反向解析

    url(r^index/(\\d+)/$,views.index,name=kkk)
    
    后端反向解析
        reverse(kkk,args=(1,))  # 后面的数字通常都是数据的id值
    前端反向解析
        % url kkk 1%   # 后面的数字通常都是数据的id值

 

有名分组反向解析
    同无名分组反向解析意义的用法
    
    url(r^index/(?P<year>\\d+)/$,views.index,name=kkk)
    
    后端方向解析
        print(reverse(kkk,args=(1,)))  # 推荐你使用上面这种  减少你的脑容量消耗
        print(reverse(kkk,kwargs=year:1))
    前端反向解析    
        <a href="% url ‘kkk‘ 1 %">1</a>  # 推荐你使用上面这种  减少你的脑容量消耗
        <a href="% url ‘kkk‘ year=1 %">1</a>

注意:在同一个应用下 别名千万不能重复!!!

 

以上是关于☆Django☆---表的设计 生命周期 分组 解析 路由层 视图层的主要内容,如果未能解决你的问题,请参考以下文章

数据的查,改,删django orm中如何创建表关系django请求生命周期流程图路由层无名有名分组反向解析

Django框架进阶7 django请求生命周期流程图, django中间件, csrf跨站请求伪造, auth认证模块

django之路由层

Django请求的生命周期图解及流程

Django---进阶2

Django---进阶2