Django模型层实现多表关系创建和多表操作( 二 )
多表数据操作 - 增删改
首先介绍多表操作的增删改操作,因为多表的查询数据操作稍微麻烦一点,单独另外开小灶 。
一对多&一对一关系 - 增删改
一对一和一对多的增删改操作基本是一致的 。
增加数据
增加数据有两种方式,一种方式是通过实际字段来添加,另一种方式是通过虚拟字段对象赋值添加 。
# 方式1:通过实际字段book_obj = models.Book.objects.create(name='哈利波特', price=10.2, publish_id=1)# 方式2,先获取出版社对象,再将书籍和出版社通过出版社对象进行关联publis_obj = models.Publish.objects.filter(pk=1).first()book_obj = models.Book.objects.create(name='哈利波特', price=10.2, publish=publis_obj)
删除数据
需要说明一点,在实际项目开发中删除数据并不是真的删除了,而是使用一个布尔类型的字段标识该数据是否删除 。
删除数据的时候如果不指定on_delete=models.DO_NOTHING默认是级联更新级联删除的 。
models.Publish.objects.filter(pk=1).delete()
修改数据
修改数据同增加数据一样有两种方式 。
# 方式1models.Book.objects.filter(pk=1).update(publish_id=1)# 方式2pub_obj = models.Publish.objects.filter(pk=2).first()models.Book.objects.filter(pk=1).update(publish=pub_obj)
多对多关系 - 增删改
首先需要明确的是,多对多的增删改是在操作第三张关系表,但是第三张关系表是django自动创建的,如何通过代码进入第三张表呢?多对多的外键关系被建在book表,多对多的外键字段是author字段,因此通过book_obj.author即可操作第三张表了 。
对于django自动创建的第三张表的多对多关系,django提供了额外的方法对数据进行操作 。
增加多对多关系 - add()
add()方法给第三张关系表添加数据,括号内既可以传数字也可以传对象,并且都支持多个同时操作 。
# 方式1,直接添加id值book_obj = models.Book.objects.filter(pk=1).first()book_obj.author.add(1)# 增加 1 1记录,即id为1的书绑定id为1的作者book_obj.author.add(2, 3)# 增加两条记录,1 2 和 1 3# 方式2,通过对象添加关系book_obj = models.Book.objects.filter(pk=2).first()author_obj1 = models.Author.objects.filter(pk=1).first()author_obj2 = models.Author.objects.filter(pk=2).first()author_obj3 = models.Author.objects.filter(pk=3).first()book_obj.author.add(author_obj1)# 增加1条记录book_obj.author.add(author_obj2, author_obj3) # 增加2条
删除多对多关系 - remove()
remove()方法用来为第三张表删除数据,同样的,括号内既可以传数字也可以传对象,并且支持多条数据同时操作 。
# 方式1:直接删除值book_obj = models.Book.objects.filter(pk=1).first()book_obj.author.remove(2)# 删除book_id为1和author_id都为2的记录book_obj.authors.remove(1, 3)# 删除多条# 方式2:通过对象删除author_obj1 = models.Author.objects.filter(pk=2).first()author_obj2 = models.Author.objects.filter(pk=3).first()book_obj.authors.remove(author_obj1, author_obj2)
修改多对多关系 - set()
set()方法用来修改第三张表,该方法是一个覆盖操作,用新的关系覆盖之前的关系,该方法的参数必须是一个列表或者元组,指出数字或对象,也支持多条数据同时操作 。
# 方式1:直接通过值进行修改book_obj = models.Book.objects.filter(pk=1).first()book_obj.author.set([2])# 将book_id为1对应的author_id修改为2book_obj.authors.set([1, 2])# 将书的作者设置为id=1 和id=2的作者# 方式2:通过对象进行修改author_obj2 = models.Author.objects.filter(pk=2).first()author_obj3 = models.Author.objects.filter(pk=3).first()book_obj.authors.set([author_obj2, author_obj3])
清空第三张表某个对象的绑定关系 - clear()
clear()方法会清空第三张关系表中某个对象的绑定关系 。
book_obj = models.Book.objects.filter(pk=1).first()book_obj.author.clear()
多表查询
在进行多表查询操作前,需要了解一个概念,什么是正向查询和反向查询 。
- 正向查询:外键在哪个表中,查询关联的表就是正向查询,比如通过书籍查询出版社;
- 反向查询:被关联的表查外键字段所在的表就是反向查询,比如通过出版社查询书籍 。
子查询
如果查询比较复杂时可以采用子查询的方式,子查询就是分步骤查询的意思,先查询得到的结果作为后查询的条件 。
正向查询
正向查询按字段,如果有多个结果需要外键字段.all(),那么怎么判断查询的结果有多个呢?如果在不加.all()的情况下得到的结果是应用名.模型名.None比如first.Author.None这种情况下说明ORM 语句没有错误,只是查询到的结果有多个,就需要加.all() 。当查询结果只有一个时得到的是一个模型对象,如果为多个就是QuerySet对象 。
- 千层比普通蛋糕热量低吗
- 角质层的作用
- sk2是不是越用角质层越薄
- 银渐层配蓝猫算串吗
- 空气炸锅是不是只能铺一层
- 高层阳台怎么封
- PS中的图层应该如何锁定
- 葡萄酒上面有一层白霉能喝吗
- 多层眼皮怎么贴双眼皮贴
- cpb的化妆水好用吗
