1. 程式人生 > 其它 >Django之ORM外來鍵增刪改

Django之ORM外來鍵增刪改

技術標籤:Djangodjangoorm外來鍵操作

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()