Django 多對(duì)多字段的更新和插入數(shù)據(jù)實(shí)例
表的普通字段 一對(duì)多字段 多對(duì)多字段 插入數(shù)據(jù)
#插入數(shù)據(jù)
def add(request):
G_title=request.POST.get('title')#-------值為:python書(shū)本
G_publish=request.POST.get('publish') #-------值為:1
G_authors_list=request.POST.getlist('authors')#-------值為:[3,7]
publish_obj=Publish.objects.get(id=G_publish)#查找Publish表對(duì)應(yīng)id的obj
authors_obj_list=Author.objects.filter(id__in=G_authors_list)#查找Author表對(duì)應(yīng)id的多個(gè)obj
title #-------普通字段
publish #-------一對(duì)多外鍵
authors #-------多對(duì)多外鍵
book_obj=Book.objects.create(title=G_title,publish=publish_obj)#添加普通和一對(duì)多外鍵的值
#添加多對(duì)多外鍵的值
方式一
book_obj.authors.add(*authors_obj_list)
方式二
for obj in authors_obj_list:
book_obj.authors.add(obj)
return redirect('/index/')
表的普通字段 一對(duì)多字段 多對(duì)多字段 修改數(shù)據(jù)
def edit(request,b_id):#b_id-----為書(shū)本的id
G_title=request.POST.get('title')#-------值為:linux書(shū)本
G_publish = request.POST.get('publish')#-------值為:2
G_authors_list = request.POST.getlist('authors')#-------值為:[3,5]
book_obj = Book.objects.get(id=b_id)#查找Book表要修改的id對(duì)象
publish_obj = Publish.objects.get(id=G_publish)#查找Publish表對(duì)應(yīng)id的obj
author_objs = Author.objects.filter(id__in=G_authors_list)#查找Author表對(duì)應(yīng)id的多個(gè)obj
book_obj.title=G_title #-------修改普通字段
book_obj.publish=publish_obj #-------修改一對(duì)多字段
book_obj.authors=author_objs #-------修改多對(duì)多字段
#注意:多對(duì)多字段 必須是.all()/.filter()等的查詢集(QuerySet)
book_obj.save() #-------一定得save(),才能對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改
return redirect('/index/')
補(bǔ)充知識(shí):Django的ManyToManyField(多對(duì)多)的使用以及through的作用
創(chuàng)建一個(gè)經(jīng)典的多對(duì)多關(guān)系:一本書(shū)可以有多個(gè)作者,一個(gè)作者可以有多本書(shū)(如下)

進(jìn)行數(shù)據(jù)遷移,然后我們使用python manage.py sqlmigrate app(應(yīng)用名) 遷移文件名 查看一下sql語(yǔ)句(如下):

從圖可以看出生成了三張表,一個(gè)是book(書(shū)籍)表包含id,title兩個(gè)字段,一個(gè)是author(作者表)包含id,name,email三個(gè)字段,這是我們剛剛在models.py文件中創(chuàng)建兩個(gè)模型,但是有一點(diǎn)需要注意的是在book表里面沒(méi)有我們創(chuàng)建的authors表,而是多了一個(gè)book_authors表,在這張表里面又多了兩個(gè)字段book_id,author_id,其實(shí)這個(gè)第三張表就是用來(lái)存放書(shū)籍和作者之間映射關(guān)系的中間表
那么我們?nèi)绾芜M(jìn)行數(shù)據(jù)的查詢呢?
1.一本書(shū)的所有作者
b = Book.objects.get(id=1)
b.author.all()
2.一個(gè)作者的所有書(shū)籍:
a = Author.objects.get(id=1)
a.book_set.all()
3.給多對(duì)多的字段添加值(添加多對(duì)多關(guān)系):

從多對(duì)多字段中刪除值(刪除多對(duì)多關(guān)系):

可以看出這個(gè)blog_book_authors是根據(jù)多對(duì)多關(guān)系自動(dòng)生成的關(guān)系表,但是如果我們想要搜集關(guān)于這個(gè)作者發(fā)布某一本書(shū)籍的時(shí)間額外增加一個(gè)字段,或者說(shuō)與現(xiàn)有的系統(tǒng)集成,這個(gè)關(guān)系表已經(jīng)存在了,那對(duì)于這樣的情形,Django允許指定一個(gè)用于管理多對(duì)多關(guān)系的中間模型,然后就可以把這些額外的字段添加到這個(gè)中間模型中,具體的方法就是在ManyToMany字段中指定through參數(shù)指定作為中介的中間模型,修改上述models.py:

查看一下此時(shí)的數(shù)據(jù)庫(kù)表結(jié)構(gòu):

在創(chuàng)建BookAuthor類的最后使用了自定義的名稱,這個(gè)也可以不用指定,系統(tǒng)可以自動(dòng)生成表名
仔細(xì)觀察BookAuthor這個(gè)類,也就是我們前面講到的中間模型,同時(shí)我們看到在創(chuàng)建中間模型的時(shí)候我們創(chuàng)建了兩個(gè)外鍵,這兩個(gè)外鍵定義了兩個(gè)模型之間是如何關(guān)聯(lián)到一起的
所以當(dāng)創(chuàng)建多對(duì)多關(guān)系模型的時(shí)候提倡使用through參數(shù)去指定并創(chuàng)建中間模型,這樣比較方便我們進(jìn)行字段的擴(kuò)展
那么此時(shí)我們又該如何添加和刪除多對(duì)多關(guān)系呢?還能使用和剛剛相同的方法嗎?
# 添加作者 ringo ringo = Author.objects.create(name='Ringo',email='ringo@qq.com') # 添加作者paul paul = Author.objects.create(name='Paul',email='paul@qq.com') # 添加書(shū)籍 python book1 book1 = Book.objects.create(title='python book1') # 給多對(duì)多添加值也就是添加多對(duì)多關(guān)系 m1 = BookAuthor(author=ringo,book=book) # 第二種添加方式 m2 = BookAuthor.objects,create(author=paul,book=book1)
當(dāng)我們使用多對(duì)多的中間模型之后,add(),remove(),create()這些方法都會(huì)被禁用,所以在創(chuàng)建這種類型的關(guān)系的時(shí)候唯一的方法就是通過(guò)創(chuàng)建中間模型的實(shí)例
以上這篇Django 多對(duì)多字段的更新和插入數(shù)據(jù)實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- django ManyToManyField多對(duì)多關(guān)系的實(shí)例詳解
- django數(shù)據(jù)關(guān)系一對(duì)多、多對(duì)多模型、自關(guān)聯(lián)的建立
- Django之多對(duì)多查詢與操作方法詳解
- Django中數(shù)據(jù)庫(kù)的數(shù)據(jù)關(guān)系:一對(duì)一,一對(duì)多,多對(duì)多
- 基于Django ORM、一對(duì)一、一對(duì)多、多對(duì)多的全面講解
- Django 標(biāo)簽篩選的實(shí)現(xiàn)代碼(一對(duì)多、多對(duì)多)
- django 多對(duì)多表的創(chuàng)建和插入代碼實(shí)現(xiàn)
- Django Xadmin多對(duì)多字段過(guò)濾實(shí)例
- Django中多對(duì)多關(guān)系三種定義方式
相關(guān)文章
python爬蟲(chóng)之requests庫(kù)使用代理方式
這篇文章主要介紹了python爬蟲(chóng)之requests庫(kù)使用代理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
selenium XPath定位的實(shí)現(xiàn)示例
XPath是一種在XML文檔中定位和選擇節(jié)點(diǎn)的語(yǔ)言,通過(guò)路徑表達(dá)式遍歷XML樹(shù),支持節(jié)點(diǎn)選取、字符串匹配、數(shù)值計(jì)算、邏輯運(yùn)算等功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10
分享十個(gè)Python提高工作效率的自動(dòng)化腳本
在這個(gè)自動(dòng)化時(shí)代,我們有很多重復(fù)無(wú)聊的工作要做。 想想這些你不再需要一次又一次地做的無(wú)聊的事情,讓它自動(dòng)化,讓你的生活更輕松。本文分享了10個(gè)Python自動(dòng)化腳本,希望對(duì)大家有所幫助2022-10-10
Python數(shù)據(jù)類型詳解(三)元祖:tuple
本文給大家介紹的是Python數(shù)據(jù)類型中的元祖(tuple),簡(jiǎn)單的說(shuō)Tuple,與列表一樣,元素也是不可變的,但與列表不同,在一個(gè)元祖可以包含不同類型的元素2016-05-05
python的input,print,eval函數(shù)概述
這篇文章主要為大家概述了python的input,print,eval函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01
python中subprocess實(shí)例用法及知識(shí)點(diǎn)詳解
在本篇文章里小編給大家分享的是關(guān)于python中subprocess實(shí)例用法及知識(shí)點(diǎn)詳解內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)下。2021-10-10
Python+Plotly繪制精美的數(shù)據(jù)分析圖
Plotly?是目前已知的Python最強(qiáng)繪圖庫(kù),比Echarts還強(qiáng)大許多。它的繪制通過(guò)生成一個(gè)web頁(yè)面完成,并且支持調(diào)整圖像大小,動(dòng)態(tài)調(diào)節(jié)參數(shù)。本文將利用Plotly繪制精美的數(shù)據(jù)分析圖,感興趣的可以了解一下2022-05-05

