多对多外键增删改(就是在操作第三张表)
生成多表的准备工作已经在博客[Django-ORM模型层语法(四)之多表操作准备工作]中写了,各位可以点击下方的链接,跟着操作:
app01_author表 :
id | name | age | author_detail_id |
---|---|---|---|
1 | Kevin | 18 | 1 |
2 | Steven | 20 | 2 |
3 | Adam | 28 | 3 |
app01_book表 :
id | title | price | publish_date | publish_id |
---|---|---|---|---|
1 | 红楼梦 | 66 | 2020-02-02 | 2 |
2 | 聊斋 | 100 | 2020-02-02 | 1 |
3 | 论语 | 200 | 2020-02-02 | 2 |
4 | 三国演义 | 300 | 2020-02-02 | 1 |
5 | 老子 | 400 | 2020-02-02 | 2 |
增
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
括号内不加任何参数
'''