目的
Django框架后面对数据库的ORM操作已经帮我们做了,我们只需要在创建model时,按照框架定义创建即可。但定义的几种ORM操作有哪些区别和怎么去操作呢?本篇详细说明。
案例
1 | #_*_coding:utf-8_*_ |
表中体现
一对一:子表从母表中选出一条数据一一对应,母表中选出来一条就少一条,子表不可以再选择母表中已被选择的那条数据
一对多:子表从母表中选出一条数据一一对应,但母表的这条数据还可以被其他子表数据选择
共同点是在admin中添加数据的话,都会出现一个select选框,但只能单选,因为不论一对一还是一对多,自己都是“一”
多对多:会各自创建一张表,并在第三张表中记录对应关系。
应用场景
一对一:一般用于某张表的补充,比如用户基本信息是一张表,但并非每一个用户都需要有登录的权限,不需要记录用户名和密码,此时,合理的做法就是新建一张记录登录信息的表,与用户信息进行一对一的关联,可以方便的从子表查询母表信息或反向查询
一对多(外键):有很多的应用场景,比如每个员工归属于一个部门,那么就可以让员工表的部门字段与部门表进行一对多关联,可以查询到一个员工归属于哪个部门,也可反向查出某一部门有哪些员工
多对多:如很多公司,一台服务器可能会有多种用途,归属于多个产品线当中,那么服务器与产品线之间就可以做成对多对,多对多在A表添加manytomany字段或者从B表添加,效果一致
一对一
查:
1 | #子表查询母表,找到红球对应的颜色 |
增:
1 | #添加一种颜色黑,并添加黑球 |
备注:增添数据的3种常用方式
1 | #增添数据的三种写法: |
改:
1 | color_obj=models.Colors.objects.get(colors="黑") #.get()等同于.filter().first() |
备注:修改数据的常见方式
1 | #更新一条数据 |
删:
1 | models.Ball.objects.get(description="灰球").delete() #对象和QuerySet都有方法delete() |
一对多(外键)
查:
1 | #外键表联合查询: |
备注:通过QuerySet的.values()方法,将QuerySet转化为ValuesQuerySet
1 | print(models.Clothes.objects.filter(color=models.Colors.objects.get(colors="红")).values('color__colors','description')) #获取子表的description字段,和母表的colors字段,获取母表字段写法: 子表外键字段名__母表字段名--适用于values()或filter() |
增:
1 | #增添子表数据,形式与一对一一致 |
改:
1 | #颜色为红的服装,description都更新为大美女 |
删:
1 | models.Clothes.objects.get(description="灰裙子").delete() #对象和QuerySet都有方法delete() |
多对多
查:
1 | #多对多子表查询母表,查找小明喜欢哪些颜色--返回:[<Colors: 红>, <Colors: 黄>, <Colors: 蓝>] |
增与改(增添子表或母表数据参照一对一的增,多对多重点在于关系表的对应关系变更):
1 | #添加子表关联关系 |
删:
删除多对多表关系 :
1 | #删除子表与母表关联关系 |
删除多对多表数据:
1 | #删除子表数据 |
删除母表数据:
默认情况下,如此例中,删除“红”色,那么子表与颜色表是一对一或外键关系的,子表对应数据会自动删除,如:红球,小虎哥
与颜色表是多对多关系的话,不会自动删除喜欢红色的人,而是去掉红色已选
如果想让与母表外键关联的子表在删除外键之后依旧可以保留子表数据,需要子表建表时加入以下字段:
1 | class Clothes(models.Model): |
choice
1 | #choices相当于实现一个简化版的外键,外键的选项不能动态更新,如可选项目较少,可以采用 |