一、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>