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>
原文地址:https://www.cnblogs.com/caoyu080202201/p/12970069.html