多对多外键增删改
作者:互联网
# 如何给书籍添加作者? 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不受影响
标签:obj,objects,author,models,外键,book,authors,增删 来源: https://www.cnblogs.com/dzs894330350/p/16098303.html