zoukankan      html  css  js  c++  java
  • Django其三

    一、ORM之创建表关系

    class Student(models.Model):
        student_name = models.CharField(max_length=32, verbose_name='学生姓名')
        student_age = models.CharField(max_length=32, verbose_name='学生年龄')
        # 学生与班级是“一班多生”的一对多关系,所以外键字段在学生表里面
        # 默认会以班级表的的主键,即id字段为外键的关联
        # 被定义为一对多的外键字段名会自动加上_id,若已有,会重复加
        classes = models.ForeignKey(to='Classes')
        # 学生与课程是“互做选择”的多对多关系,且学生表查询频率较高,所以外键字段最好在学生表里面
        # 被定义为多对多的外键字段是虚拟字段,只是ORM创建关系表的依据,同步到数据库后,不会有该字段,相应的会多一个关系表
        # 关系表的名称会就是 本类名_虚拟字段
        # 关系表有 id(主键),本类名_id,关系类名_id 这三个字段
        course = models.ManyToManyField(to='Course')
        # 学生与更多学生信息是一对一关系,学生表的查询频率较高,所以外键字段最好在学生表里面
        # 默认会以更多学生信息表的的主键,即id字段为外键的关联
        # 被定义为一对一的外键的字段名会自动加上_id,若已有,会重复加
        student_more_info = models.OneToOneField(to='StudentMoreInfo')
        # 在Django的1.0+版本中,默认外键都是级联更新,级联删除的
        # 关联表名可以不加引号,但是必须是已定义的模型类
    
    
    class Classes(models.Model):
        classes_name = models.CharField(max_length=32, verbose_name='班级名称')
        classes_type = models.CharField(max_length=32, verbose_name='班级类型')
    
    
    class Course(models.Model):
        course_name = models.CharField(max_length=32, verbose_name='课程名称')
        course_level = models.CharField(max_length=32, verbose_name='课程等级')
    
    
    class StudentMoreInfo(models.Model):
        # 此处用长整型,也可以用字符型
        student_phone = models.BigIntegerField(verbose_name='学生电话')
        # 浮点型,总8位,小数部分2位
        student_height = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='学生身高')

    二、路由层

      1、路由匹配:url方法的第一个参数是正则匹配式,在路由层的urlpatterns列表中自上向下匹配,只要匹配上,就会执行对应的视图函数,不再继续向下匹配。

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        # 下面是路由匹配的完整书写方式,^ 限定了开头,$ 限定了结尾
        url(r'^xxx/$', app01_views.xxx),
        # 匹配主页
        url(r'^$', app01_views.home_page)
    ]

      2、自动补斜杠:在输入url的时候,若没有以斜杠结尾匹配不上的时候,Django内部自动做了重定向处理,会加上斜杠再匹配一次,可以在配置文件中书写---APPEND_SLASH = True/False,来声明是否自动重定向,不声明则默认为True。

      3、匹配式分组:正则匹配式中用斜杠隔开并用小括号框起来的为一个分组。

        ①无名分组:

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        # 如此书写的匹配式,对应的视图函数在 request 形参后面,还需定义一个位置形参用于接收该无名分组匹配到的内容
        url(r'^xxx/(d+)/', app01_views.xxx)
    ]

        ②有名分组:

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        # 如此书写的匹配式,对应的视图函数在 request 形参后面,还需定义一个名为 info 的关键字参用于接收该有名分组匹配到的内容
        url(r'^xxx/(?P<info>d+)/', app01_views.xxx)
    ]

        ③无名分组和有名分组不能能混合使用,但是可以一条匹配式内多次使用同类分组。

      4、反向解析:利用一些解析手段得到一个结果,通过该结果可以访问到对应的url,从而触发相应的视图函数的执行。

        ①先在路由层,给路由与视图函数的对应关系起一个别名,该别名即绑定了对应关系。

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        # 将下面的路由与视图函数的对应关系绑定给了 'ooo'
        url(r'^xxx/', app01_views.xxx, name='ooo')
    ]

        ②在后端利用别名反向解析:

    from django.shortcuts import render, reverse, HttpResponse, redirect
    
    
    def index(request):
        # 拿到的是路由名 即 /xxx/
        print(reverse('ooo'))
        return HttpResponse('111')

        ③在前端利用别名反向解析:

    def index(request):
        return render(request, '111.html')
    
    
    def xxx(request):
        return HttpResponse('来自xxx')
    {# url会对应成 'ooo' 绑定的路由名,即 /xxx/ #}
    <a href="{% url 'ooo' %}">点击跳转'xxx'的页面</a>
  • 相关阅读:
    原笔迹手写实现平滑和笔锋效果之:笔迹的平滑(二)
    区块链入门(4)Truffle创建项目,编译,及项目部署
    github的基本使用
    ES6新特性之傻瓜式说明
    webpack之傻瓜式教程及前端自动化入门
    查找树莓派ip地址的常用方法
    树莓派的无屏幕安装的教程
    采用QHD分辨率使用kinect2_calibration,完成QHD图像校正
    编译ORBSLAM2 build_ros.sh,实现kinect2在ROS环境下运行ORBSLAM2
    重写kinect2_viewer,编译高博kinect2在orbslam2上跑的程序(解决cmakefile中库依赖和头文件的问题)
  • 原文地址:https://www.cnblogs.com/caoyu080202201/p/12970069.html
Copyright © 2011-2022 走看看