首页 > 其他 > 详细

Django其三

时间:2020-05-27 09:08:04      阅读:46      评论:0      收藏:0      [点我收藏+]

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

 

Django其三

原文:https://www.cnblogs.com/caoyu080202201/p/12970069.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!