1. 程式人生 > 程式設計 >Django 多對多欄位的更新和插入資料例項

Django 多對多欄位的更新和插入資料例項

表的普通欄位 一對多欄位 多對多欄位 插入資料

#插入資料
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表對應id的obj 
 authors_obj_list=Author.objects.filter(id__in=G_authors_list)#查詢Author表對應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/')

表的普通欄位 一對多欄位 多對多欄位 修改資料

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表對應id的obj
 author_objs = Author.objects.filter(id__in=G_authors_list)#查詢Author表對應id的多個obj
 
 
 book_obj.title=G_title   #-------修改普通欄位
 book_obj.publish=publish_obj #-------修改一對多欄位
 book_obj.authors=author_objs #-------修改多對多欄位 
 #注意:多對多欄位 必須是.all()/.filter()等的查詢集(QuerySet)
 book_obj.save()     #-------一定得save(),才能對資料庫進行修改
 
 return redirect('/index/')

補充知識:Django的ManyToManyField(多對多)的使用以及through的作用

建立一個經典的多對多關係:一本書可以有多個作者,一個作者可以有多本書(如下)

Django 多對多欄位的更新和插入資料例項

進行資料遷移,然後我們使用python manage.py sqlmigrate app(應用名) 遷移檔名 檢視一下sql語句(如下):

Django 多對多欄位的更新和插入資料例項

從圖可以看出生成了三張表,一個是book(書籍)表包含id,title兩個欄位,一個是author(作者表)包含id,name,email三個欄位,這是我們剛剛在models.py檔案中建立兩個模型,但是有一點需要注意的是在book表裡面沒有我們建立的authors表,而是多了一個book_authors表,在這張表裡面又多了兩個欄位book_id,author_id,其實這個第三張表就是用來存放書籍和作者之間對映關係的中間表

那麼我們如何進行資料的查詢呢?

1.一本書的所有作者

b = Book.objects.get(id=1)
b.author.all()

2.一個作者的所有書籍:

a = Author.objects.get(id=1)
a.book_set.all()

3.給多對多的欄位新增值(新增多對多關係):

Django 多對多欄位的更新和插入資料例項

從多對多欄位中刪除值(刪除多對多關係):

Django 多對多欄位的更新和插入資料例項

可以看出這個blog_book_authors是根據多對多關係自動生成的關係表,但是如果我們想要蒐集關於這個作者釋出某一本書籍的時間額外增加一個欄位,或者說與現有的系統整合,這個關係表已經存在了,那對於這樣的情形,Django允許指定一個用於管理多對多關係的中間模型,然後就可以把這些額外的欄位新增到這個中間模型中,具體的方法就是在ManyToMany欄位中指定through引數指定作為中介的中間模型,修改上述models.py:

Django 多對多欄位的更新和插入資料例項

檢視一下此時的資料庫表結構:

Django 多對多欄位的更新和插入資料例項

在建立BookAuthor類的最後使用了自定義的名稱,這個也可以不用指定,系統可以自動生成表名

仔細觀察BookAuthor這個類,也就是我們前面講到的中間模型,同時我們看到在建立中間模型的時候我們建立了兩個外來鍵,這兩個外來鍵定義了兩個模型之間是如何關聯到一起的

所以當建立多對多關係模型的時候提倡使用through引數去指定並建立中間模型,這樣比較方便我們進行欄位的擴充套件

那麼此時我們又該如何新增和刪除多對多關係呢?還能使用和剛剛相同的方法嗎?

 # 新增作者 ringo
 ringo = Author.objects.create(name='Ringo',email='[email protected]')
 # 新增作者paul
 paul = Author.objects.create(name='Paul',email='[email protected]')
 # 新增書籍 python book1
 book1 = Book.objects.create(title='python book1')
 # 給多對多新增值也就是新增多對多關係
 m1 = BookAuthor(author=ringo,book=book)
 # 第二種新增方式
 m2 = BookAuthor.objects,create(author=paul,book=book1)

當我們使用多對多的中間模型之後,add(),remove(),create()這些方法都會被禁用,所以在建立這種型別的關係的時候唯一的方法就是通過建立中間模型的例項

以上這篇Django 多對多欄位的更新和插入資料例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。