其他分享
首页 > 其他分享> > 多对多外键增删改

多对多外键增删改

作者:互联网

# 如何给书籍添加作者?
    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