這篇文章主要介紹Django中多對多字段更新和插入數(shù)據(jù)的實現(xiàn)方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
目前創(chuàng)新互聯(lián)公司已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站改版維護、企業(yè)網(wǎng)站設(shè)計、江城網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。表的普通字段 一對多字段 多對多字段 插入數(shù)據(jù)
#插入數(shù)據(jù) def add(request): G_title=request.POST.get('title')#-------值為:python書本 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表對應(yīng)id的obj authors_obj_list=Author.objects.filter(id__in=G_authors_list)#查找Author表對應(yīng)id的多個obj title #-------普通字段 publish #-------一對多外鍵 authors #-------多對多外鍵 book_obj=Book.objects.create(title=G_title,publish=publish_obj)#添加普通和一對多外鍵的值 #添加多對多外鍵的值 方式一 book_obj.authors.add(*authors_obj_list) 方式二 for obj in authors_obj_list: book_obj.authors.add(obj) return redirect('/index/')
表的普通字段 一對多字段 多對多字段 修改數(shù)據(jù)
def edit(request,b_id):#b_id-----為書本的id G_title=request.POST.get('title')#-------值為:linux書本 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對象 publish_obj = Publish.objects.get(id=G_publish)#查找Publish表對應(yīng)id的obj author_objs = Author.objects.filter(id__in=G_authors_list)#查找Author表對應(yīng)id的多個obj book_obj.title=G_title #-------修改普通字段 book_obj.publish=publish_obj #-------修改一對多字段 book_obj.authors=author_objs #-------修改多對多字段 #注意:多對多字段 必須是.all()/.filter()等的查詢集(QuerySet) book_obj.save() #-------一定得save(),才能對數(shù)據(jù)庫進行修改 return redirect('/index/')
補充知識:Django的ManyToManyField(多對多)的使用以及through的作用
創(chuàng)建一個經(jīng)典的多對多關(guān)系:一本書可以有多個作者,一個作者可以有多本書(如下)
進行數(shù)據(jù)遷移,然后我們使用python manage.py sqlmigrate app(應(yīng)用名) 遷移文件名 查看一下sql語句(如下):
從圖可以看出生成了三張表,一個是book(書籍)表包含id,title兩個字段,一個是author(作者表)包含id,name,email三個字段,這是我們剛剛在models.py文件中創(chuàng)建兩個模型,但是有一點需要注意的是在book表里面沒有我們創(chuàng)建的authors表,而是多了一個book_authors表,在這張表里面又多了兩個字段book_id,author_id,其實這個第三張表就是用來存放書籍和作者之間映射關(guān)系的中間表
那么我們?nèi)绾芜M行數(shù)據(jù)的查詢呢?
1.一本書的所有作者
b = Book.objects.get(id=1)
b.author.all()
2.一個作者的所有書籍:
a = Author.objects.get(id=1)
a.book_set.all()
3.給多對多的字段添加值(添加多對多關(guān)系):
從多對多字段中刪除值(刪除多對多關(guān)系):
可以看出這個blog_book_authors是根據(jù)多對多關(guān)系自動生成的關(guān)系表,但是如果我們想要搜集關(guān)于這個作者發(fā)布某一本書籍的時間額外增加一個字段,或者說與現(xiàn)有的系統(tǒng)集成,這個關(guān)系表已經(jīng)存在了,那對于這樣的情形,Django允許指定一個用于管理多對多關(guān)系的中間模型,然后就可以把這些額外的字段添加到這個中間模型中,具體的方法就是在ManyToMany字段中指定through參數(shù)指定作為中介的中間模型,修改上述models.py:
查看一下此時的數(shù)據(jù)庫表結(jié)構(gòu):
在創(chuàng)建BookAuthor類的最后使用了自定義的名稱,這個也可以不用指定,系統(tǒng)可以自動生成表名
仔細觀察BookAuthor這個類,也就是我們前面講到的中間模型,同時我們看到在創(chuàng)建中間模型的時候我們創(chuàng)建了兩個外鍵,這兩個外鍵定義了兩個模型之間是如何關(guān)聯(lián)到一起的
所以當創(chuàng)建多對多關(guān)系模型的時候提倡使用through參數(shù)去指定并創(chuàng)建中間模型,這樣比較方便我們進行字段的擴展
那么此時我們又該如何添加和刪除多對多關(guān)系呢?還能使用和剛剛相同的方法嗎?
# 添加作者 ringo ringo = Author.objects.create(name='Ringo',email='ringo@qq.com') # 添加作者paul paul = Author.objects.create(name='Paul',email='paul@qq.com') # 添加書籍 python book1 book1 = Book.objects.create(title='python book1') # 給多對多添加值也就是添加多對多關(guān)系 m1 = BookAuthor(author=ringo,book=book) # 第二種添加方式 m2 = BookAuthor.objects,create(author=paul,book=book1)
當我們使用多對多的中間模型之后,add(),remove(),create()這些方法都會被禁用,所以在創(chuàng)建這種類型的關(guān)系的時候唯一的方法就是通過創(chuàng)建中間模型的實例
以上是“Django中多對多字段更新和插入數(shù)據(jù)的實現(xiàn)方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。