关于Django的一对一,一对多,多对多

前言

在学习Django时,我对于mtv中的m始终有一丝疑惑,也就是model。因为作者是第一次学习orm,一对一一对多我是可以理解的,但是多对多我不知道该怎么写,查阅了一些文章后才得以解决。

正文

1. 一对一

一对一映射关系,原则上是可以将两张表合并的,不过是因为考虑到数据的安全性而单独放在一起,比如创建两张表,学生表学生信息表学生表有学生的姓名,性别,学号一些可以公开的信息,而学生信息表里则包括学生电话,身份证号,等一些私密的信息,如果这些信息放在一张表里,有两个缺点
1.当学生很多时,如果要获取所有学生的部分数据,一张表消耗资源会多一些,而分为两张表可以消耗更少的资源。
2.如果只有一张表,学生的私密信息将很容易就可以查询到,而分为两张表可以起到对私密信息的保护作用。
一对一中,两表之间的主副关系可以互换,但一般会根据客观常识来确定主副关系

学生表:
学号学生姓名
101张三
102李四
103王五
学生信息表:
学号电话号码身份证号
101136****00011000****0001
102136****00021000****0002
103136****00031000****0003

2. 一对多

一对多多对一是相对而来的,在我看来其实是一个东西,但有的文章把它分为两类,感觉有点不太理解。
一对多中,“多”属于主表,“一”属于副表,所以ForeiKey写在主表中的,例如一个班级表和一个学生表,一个班级有多个学生,但是一个学生只属于一个班级。
一对多中,两表之间的主副关系是确定的,“多”是主表,“一”是副表。

班级表(副表):
班级名……
一班
二班
三班
学生表(主表):
学生姓名所属班级(外键)
张三一班
李四一班
王五二班
赵六三班

3.多对多

Djangomtv中,我对model中的多对多总是有些不太理解,多对多它的主副关系是否为确定的,它在数据库中的映射关系又是如何。在查阅了一些资料之后,也总算理解了。
多对多的主副关系是可以互换的,一般而言根据客观常识来确定,就和一对一差不多。
举个例子,有一张教师表和一张班级表,一个老师可能会教多个班级,而一个班级也有多个老师教课,在这里,教师和班级就是多对多的关系,可以将班级表作为主表,此时,需要在班级表里定义ManyToManyField字段;如果将教师表作为主表,需要在教师表里定义ManyToManyField字段。
而在数据库中的表现为,教师表班级表之间有一张映射表,教师表和班级表分别与映射表之间形成一对多的关系。

教师表:
教师姓名……
张三
李四
王五
班级表:
班级名……
一班
二班
三班
映射表:
教师姓名班级名
张三一班
张三二班
李四一班
李四三班
王五一班
王五二班
王五三班

在这三张表里就定义了多对多的关系。张三教一班和二班,而一班也有张三李四王五三位老师。
归根结底,多对多也就是一对一对多组合而成,而在Djangoorm中,简化了这一操作,使得我们我用创建中间表便可创建多对多的关系。

总结

由于之前在学校只学过一些简单的数据库知识,对于表与表之间的关系学得并不好,而且真正的sql语句orm操作是有一些区别的,orm简化了我们对于数据库的操作,也在一定程度上增加了安全性(比如sql注入),但也因此减慢了运行速度,orm操作的底层还是对sql语句的实现,要想更好的理解orm,还是要学习一下sql方面的知识。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值