首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

零基础入手Django(八):模型基础3

今天是2019年2月20日,小叮当来继续为大家分享Django的干货~

主要内容有:表的级联删除、表关联对象的访问、表关联对象的补充、关系表的数据操作和多表查询。

首先,我们接着昨天所建的项目db_test,为其配置路由

(1)为db_test新建urls.py文件

(2)在主路由中为db_test分配子路由

(3)设置db_test的views.py定义视图函数

(4)在db_test的urls.py中配置对应的路由

(5)在浏览器中访问

(6)通过xshell进行查看

可以看到,学院表和学生表已成功创建。

一、表的级联删除

(1)在主表中删除数据,对应表中的数据也会被删除。

例如,将学院表中的计算机学院删除,对应学生表中属于计算机学院的小叮当则也会被删除。

重新定义db_test中views.py里的视图函数test

在浏览器中访问,使视图函数运行

通过xshell查看数据库

可见计算机学院从学院表中删除后,与之关联的学生表中的小叮当也被删除了。

(2)设置默认值为空的级联删除

当我们进行级联删除时,只想删除主表中的数据以及其他表对它的引用,而不删除其他表中的数据时,该怎么做呢?

例如,我想删除学院表中id=2的音乐学院和学生表中对音乐学院的引用,而不删除学生表中的少年叮当

首先,我们可以在xshell中进入mysql

执行 show create table db_test_student\G查看创建db_test_student表的mysql语句"\G"表示结果按列输出

可以看到,department_id不允许为空

我们在models.py中更改表结构,将学生信息表中的on_delete其设置为默认值为空的级联删除

具体代码如下:

(当然,如果不想执行级联删除,可以on_delete=models.PROTECT 将其保护起来)

更改表结构后,执行映射等操作。

在Tools中找到Run manage.py Task...

执行makemigrations

执行migrate

之后在xhell的mysql中再次查看表结构,发现department_id字段已默认为空

重新定义db_test中views.py里的视图函数test

在浏览器中访问

通过xshell查看数据库

二、表关联对象的访问

1.一对多关联 学院表和学生表

(1)在models.py中重新定义模型类,为学院表和学生表加上自定义输出def __str__(self)

(2)重新定义视图函数

(3)在浏览器中访问

(4)在后台查看输出

小结:在学生表查询到的学生信息相当于学生类的实例对象,可以直接像访问成员函数那样访问学院类中的属性,以此来实现表关联对象的访问。

值得注意,学生表关联了学院表,想查询学院有哪些学生时就属于反向查询了。

反向查询

(1)直接反向查询

直接反向查询,是通过查询关键字加”_set"来实现的,例如“student_set",如果表关系是一对一,则不加_set也可。

(2)重命名查询 related_name

通过在模型类中添加related_name的方法,也可进行反向查询

具体代码如下

此时进行反向查询时,使用students即可。因为系统中已经没有了student_set属性,若还按student_set查询则会报错

在视图函数中改为用students查询,即可成功查询

2.一对一关联 学生表和学生详细表

(1)查看学生信息详细表 和学生表

(2)models.py中在学生详细模型类中自定义输出 def__str__(self)

(3)views.py中根据表字段创建数据表

由于学生详细信息表关联的是学生表,所以在创建学生详细表时,id要从学生表里现在有的”2、3、4、5“中创建。

在浏览器中访问触发视图函数

在数据库中查看

(4)重新定义视图函数

(5)在浏览器中访问

(6)在后台查看

3.多对多关联 学生表和课程表

(1)查询课程表字段

根据字段在views.py中为课程表添加数据

在浏览器中访问

在数据库中查看

在models.py中为课程表自定义输出 def __str__(self)

由于访问方法和之前的一样,这里不再演示,在views.py中定义代码如下

三、表关联对象的补充

在表关联中的正向查询是指,一个表的模型类可以在另个一表的模型类中找到。

例如,在课程表的模型类中可以直接访问到学生表模型类

那么,查询一门课程所选的学生就是正向查询。反之查询学生选了哪些课就是反向查询。

四、关系表的数据操作

1.数据的添加

(1)一对多关系 add()添加已经存在的数据 create()添加新的数据

在views.py中重新定义视图函数

在浏览器中访问触发视图函数

在数据库中查看

(2)多对多关系add()添加已经存在的数据 create()添加新的数据

在views.py中重新定义视图函数

在浏览器中访问 触发视图函数

在数据库中查找课程表、课程-学生中间信息表

2.数据删除 remove() 和clear()

(1)remove()

一对多关系的表使用remove删除时,必须保证外键列允许为空

例如,学院表和学生的对应关系

多对多关系,使用remove删除,删除掉的是中间信息表

在视图函数中定义

在浏览器中访问

在数据库中查询

(2)clear()进行清空

使用print查看3号学生选了哪些课程

定义视图函数

浏览器中访问

后台中查看

定义视图函数使用clear

浏览器中访问

后台查询

数据库中查询中间课程-学生信息表

可见,clear()会将符合条件的数据全部清空0

五、多表查询

多表查询又被称为是跨关联关系的查询。

Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理JOIN。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段。

1.重建学生选课数据

在views.py中重新定义视图函数

在浏览器中访问 触发视图函数

在数据库中查看

2.进行多表查询

在views.py中重新定义视图函数

在浏览器中查看

在后台查看

对照数据库进行检验

经检查查询结果正确,可见Django的多表查询结果是十分便捷的了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190220A101Y700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券