多对多外键增删改
# 如何给书籍添加作者?
book_obj = models.Book.objects.filter(pk=1).first()
# print(book_obj.authors) # 就类似于你已经到了第三张关系表了
# book_obj.authors.add(1) # 书籍id为1的书籍绑定一个主键为1 的作者
# book_obj.authors.add(2,3)
# author_obj = models.Author.objects.filter(pk=1).first()
# author_obj1 = models.Author.objects.filter(pk=2).first()
# author_obj2 = models.Author.objects.filter(pk=3).first()
# book_obj.authors.add(author_obj)
# book_obj.authors.add(author_obj1,author_obj2)
"""
add给第三张关系表添加数据
括号内既可以传数字也可以传对象 并且都支持多个
"""
# 删
# book_obj.authors.remove(2)
# book_obj.authors.remove(1,3)
# author_obj = models.Author.objects.filter(pk=2).first()
# author_obj1 = models.Author.objects.filter(pk=3).first()
# book_obj.authors.remove(author_obj,author_obj1)
"""
remove
括号内既可以传数字也可以传对象 并且都支持多个
"""
# 修改
# book_obj.authors.set([1,2]) # 括号内必须给一个可迭代对象
# book_obj.authors.set([3]) # 括号内必须给一个可迭代对象
# author_obj = models.Author.objects.filter(pk=2).first()
# author_obj1 = models.Author.objects.filter(pk=3).first()
# book_obj.authors.set([author_obj,author_obj1]) # 括号内必须给一个可迭代对象
"""
set
括号内必须传一个可迭代对象,该对象内既可以数字也可以对象 并且都支持多个
"""
# 清空
# 在第三张关系表中清空某个书籍与作者的绑定关系
book_obj.authors.clear()
"""
clear
括号内不要加任何参数
"""
有几个注意的:
在多对多增加的时候,使用的book对象.author(多对多的表)就是进入了第三张表,并且第三张表的bookid就是当前book对象的id,是自动填的,而主动去添加的就是要用book.author.add(2)添加作者的id
第三张表的字段是各自的主键id,book的id 和 author的id
在修改的时候需要传一个可迭代对象,传过去的值 要是没有 就会删除,然后新建,比如第三张表中有1 1,1 3 两条数据,传的是[1,2] 查询1有不删,查询到2没有,删除其他然后创建1 2,(注意整个左边的1一直是book的id,自动传的)
所以整个修改就很不好, 比如这里面的1书的作者有5个人,分别是 1 1,1 2 ,1 2 ,1 3 ,1 5 然后我传了6 ,这样就把1-5的作者全删了,然后只增了一条1 6 ,这TM还是修改??? 我要修改谁 就不传谁?? 不修改的就将ID都传过去??这是什么鬼
这个set搞不好,还是先设置is_bool把,把1 3设置false吧 代表1这本书的作者 不是3了, 如果要重新设置1这本书的作者,直接重新新增吧,但是这个就需要半自动建表了,也是麻烦
注意修改删除的都是查询的那条book的数据,其他的book不受影响
浙公网安备 33010602011771号