Django-ORM模型层语法(六)多表操作之多对多外键增删改

多对多外键增删改(就是在操作第三张表)

生成多表的准备工作已经在博客[Django-ORM模型层语法(四)之多表操作准备工作]中写了,各位可以点击下方的链接,跟着操作:

多表操作的准备工作(非常重要!一定要看喔!)

app01_author表 :

idnameageauthor_detail_id
1Kevin181
2Steven202
3Adam283

app01_book表 :

idtitlepricepublish_datepublish_id
1红楼梦662020-02-022
2聊斋1002020-02-021
3论语2002020-02-022
4三国演义3002020-02-021
5老子4002020-02-022

app01/tests.py

"""
当你只是想测试django中的某一个py文件内容 那么你可以不用书写前后端交互的形式
而是直接写一个测试脚本即可
脚本代码无论是写在应用下的tests.py还是自己单独开设py文件都可以
"""
# 测试环境的准备 去manage.py中拷贝前四行代码 然后自己写两行
import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm1.settings")
    import django
    django.setup()
    # 在这个代码块的下面就可以测试django里面的单个py文件了
    # 所有的代码都必须等待环境准备完毕之后书写
    from app01 import models

    # 多对多  增删改 就是在操作第三张表

    # 增
    # 如何给书籍添加作者
    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_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.authors.add(author_obj1)
    book_obj.authors.add(author_obj2,author_obj3)
    '''
    add给第三张关系表添加数据
        括号内既可以传数字,也可以传对象,并且支持多个
    '''

app01_book_authors表 :
| id |book_id|author_id|
|–|–|–|–|
| 1 |1| 1|
| 2 |1| 2|
| 3|1| 3|

app01/tests.py

import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm1.settings")
    import django
    django.setup()
    from app01 import models

    # 删
    book_obj = models.Book.objects.filter(pk=1).first()
    # 方式一
    book_obj.authors.remove(2)
    book_obj.authors.remove(1,3)
    # 方式二
    author_obj1 = models.Author.objects.filter(pk=1).first()
    author_obj2 = models.Author.objects.filter(pk=2).first()
    book_obj.authors.remove(author_obj1,author_obj2)
    '''
    remove给第三张关系表添加数据
        括号内既可以传数字,也可以传对象,并且支持多个
    '''

app01/tests.py

import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm1.settings")
    import django
    django.setup()
    from app01 import models

    # 修改
    book_obj = models.Book.objects.filter(pk=1).first()
    # 方式一
    book_obj.authors.set([1,3]) # 括号内必须给一个可迭代对象
    # 方式二
    author_obj1 = models.Author.objects.filter(pk=1).first()
    author_obj2 = models.Author.objects.filter(pk=2).first()
    book_obj.authors.set([author_obj1,author_obj2])
    '''
    set
        括号内必须穿一个可迭代对象,该对象既可以是数字也可以是对象,并且支持多个
        先删除,后新增
    '''

清空

app01/tests.py

import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm1.settings")
    import django
    django.setup()
    from app01 import models

    # 在第三张关系表中,清空某书籍与作者的绑定关系
    book_obj = models.Book.objects.filter(pk=1).first()
    book_obj.authors.clear()
    '''
    clear
        括号内不加任何参数
    '''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值