Django之ORM外键增删改

Django之ORM外键增删改

三个外键概念
一对一:表A中的一条数据对应表B中的一条数据
一对多:表A中的一条数据对应表B中的多条数据
多对多:表A中一条数据对应表B中多条数据 且 表B中一条数据也可能对应表A中多条数据

一对多 增删改

# Book表中存在外键字段对应Publish表(一对多)
""" 增 """

# 第一种方式:直接写实际字段 id
models.Book.objects.create(title="python入门", price=98.80, publish_id=1)

# 第二种方式:虚拟字段,对象
# 获取到publish对象
publish_obj = models.Publish.objects.filter(pk=1).first()
# 通过对象进行添加
models.Book.objects.create(title="python入门到放弃", price=258.99, publish=publish_obj)

""" 删 """
models.Publish.objects.filter(pk=1).delete()  # 级联删除

""" 修改 """
# 通过主键修改
models.Book.objects.filter(pk=1).update(publish_id=2)
publish_obj = models.Publish.objects.filter(pk=1).first()
# 通过对象修改
models.Book.objects.filter(pk=1).update(publish=publish_obj)

多对多 增删改(本质上就是在操作第三张关联表)

# Book表存在外键字段与Author关联(多对多)
""" 新增 """

# 获取到book对象
book_obj = models.Book.objects.filter(pk=1).first()

# 书籍(book)id为1的数据绑定一个主键为1的作者(author)
book_obj.authors.add(1)   # book_obj.authors  类似于你已经到了第三张关系表了
# 书籍(book)id为1的书籍绑定一个主键为2和3的作者(author)
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)  # 同时添加多个对象

""" 删 remove """
# 只删除第三张关系表中的关联关系数据
# 括号内既可以传数字(主键)也可以传对象,并且都支持多个

# 指定外键id单个删除
book_obj.authors.remove(1)  
# 指定多个外键id同时删除
book_obj.authors.remove(1, 3)  

author_obj1 = models.Author.objects.filter(pk=2).first()
author_obj2 = models.Author.objects.filter(pk=3).first()

# 通过对象删除
# 单个
book_obj.authors.remove(author_obj1)
# 多个
book_obj.authors.remove(author_obj1, author_obj2)


""" 修改 set """
# 只修改第三张关系表中的关联关系数据
# 修改括号内必须传入可迭代对象 元组 列表都可以   重点!!!

# 通过id方式
book_obj.authors.set((1, 2)) 

# 通过对象方式
author_obj1 = models.Author.objects.filter(pk=2).first()
author_obj2 = models.Author.objects.filter(pk=3).first()
book_obj.authors.set([author_obj1, author_obj2])


""" 清空 clear """
# 清空第三张关系表中book_obj对象与authors所有关系数据
book_obj.authors.clear()
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值