Django之ORM外來鍵增刪改
阿新 • • 發佈:2021-02-02
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()