創建一個經典的多對多關系:一本書可以有多個作者,一個作者可以有多本書(如下)
運行“python manage.py makemigratons"和"python manage.py migrate”進行數據遷移之后,
會生成三張表,一個是book(書籍)表包含id,title兩個字段,一個是author(作者表)包含id,name兩個字段,這是我們剛剛在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() #反向查詢
但是如果我們想要搜集關於這個作者發布某一本書籍的時間額外增加一個字段,或者說與現有的系統集成,這個關系表已經存在了,那對於這樣的情形,Django允許指定一個用於管理多對多關系的中間模型,然后就可以把這些額外的字段添加到這個中間模型中,具體的方法就是在ManyToMany字段中指定through參數作為中介的中間模型,修改上models.py:
仔細觀察BookAuthor這個類,也就是我們前面講到的中間模型,同時我們看到在創建中間模型的時候我們創建了兩個外鍵,這兩個外鍵定義了兩個模型之間是如何關聯到一起的, 所以當創建多對多關系模型的時候提倡使用through參數去指定並創建中間模型,這樣比較方便我們進行字段的擴展
那么此時我們又該如何添加和刪除多對多關系呢?還能使用和剛剛相同的方法嗎?
# 添加作者 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')
# 給多對多添加值也就是添加多對多關系
m1 = BookAuthor(author=ringo,book=book1)
# 第二種添加方式
m2 = BookAuthor.objects,create(author=paul,book=book1)
當我們使用多對多的中間模型之后,add(),remove(),create()這些方法都會被禁用,所以在創建這種類型的關系的時候唯一的方法就是通過創建中間模型的實例