61.Django03
Posted heirenxilou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了61.Django03相关的知识,希望对你有一定的参考价值。
一、Django ORM创建表关系
表与表之间无非三种关系:一对多,多对多,一对一
我们就拿之前mysql用的作者和图书之间的多对多关系,再加上一个出版社表来形成上述三种关系的例子
很明显,我们可以看出:
图书和出版社是一对多的关系 外键字段建在多的那一方
图书和作者是多对多的关系 需要创建第三张表来专门存储
作者与作者详情表是一对一
了解完了表关系,那在ORM中我们用代码来实现
首先是创建表,然后再添加外键
class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=8,decimal_places=2) # 总共八位 小数点后面占两位 """ 图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面 """ publish = models.ForeignKey(to=‘Publish‘) # 默认就是与出版社表的主键字段做外键关联 """ 如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id 如果你自作聪明的加了_id那么orm还是会在后面继续加_id 后面在定义ForeignKey的时候就不要自己加_id """ """ 图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方 """ authors = models.ManyToManyField(to=‘Author‘) """ authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系 让orm自动帮你创建第三张关系表 """ class Publish(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=32) class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() """ 作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中 """ author_detail = models.OneToOneField(to=‘AuthorDetail‘) """ OneToOneField也会自动给字段加_id后缀 所以你也不要自作聪明的自己加_id """ class AuthorDetail(models.Model): phone = models.BigIntegerField() # 或者直接字符类型 addr = models.CharField(max_length=32)
那么上述的几种表之间的关系我们就通过Django ORM代码实现了
这里需要注意的是在django1.X版本中外键默认都是级联更新删除的
二、Django请求生命周期流程
1、请求生命周期的概念
Django的请求生命周期是指:当用户在浏览器上输入url到用户看到网页的这个时间段内,Django后台所发生的事情。
2、请求生命周期内的过程
(1)过程描述
第一步:浏览器发起请求
第二步:WSGI创建socket服务端,接收请求(Httprequest)
第三步:中间件处理请求
第四步:url路由,根据当前请求的URL找到视图函数
第五步:view视图,进行业务处理(ORM处理数据,从数据库取到数据返回给view视图;view视图将数据渲染到template模板;将数据返回)
第六步:中间件处理响应
第七步:WSGI返回响应(HttpResponse)
第八步:浏览器渲染
这张图就是Django请求生命周期的这么一个流程图
以上是关于61.Django03的主要内容,如果未能解决你的问题,请参考以下文章