接着前面的例子,舉例多表查詢實例如下:
1.查詢作戰的所有完整信息。
>>> AuthorDetail.objects.values('sex','email','address','birthday','author__name')
2.查詢《持續集成實踐》這本書的作者姓名,還有出版社的名字
>>> Book.objects.filter(title='持續集成實踐').values('authors__name','publisher__name')
3.查詢潘曉明寫了一些什么書
>>> Book.objects.filter(authors__name='潘曉明').values('title')
4.查詢機械工業出版社都出版了一些什么書籍
>>> Book.objects.filter(publisher__name='機械工業出版社').values('title')
>>> publisher = Publisher.objects.get(name='機械工業出版社') >>> publisher.book_set.all().values('title')
5.查詢機械工業出版社都有哪些作者出過書
>>> Book.objects.filter(publisher__name='機械工業出版社').values('title','authors__name')
多表查詢技巧:
__:兩個下划線可以生成連接查詢,查詢關聯的字段信息
_set:提供了對象訪問相關聯表數據的方法。但這種方法只能是相關類訪問定義了關系的類(主鍵類訪問外鍵類)。
ManyToMany
多對多之查詢:
正向查詢:查詢書籍id=1的所有作者
b1=Book.objects.get(id=1)
b1.authors.all()
反向查詢:查詢id=3的作者所出版的所有書籍
a1=Author.objects.get(id=3)
a1.book_set.all()
正向聯表查詢:查詢書籍id=1的所有作者
Book.objects.filter(id=1).values('authors__name')
反向聯表查詢:查詢id=3的作者所出版的所有書籍
Author.objects.filter(id=3).values('book__title')
多對多添加:
正向添加:
b1=Book.objects.get(id=1) a1=Author.objects.get(id=2) b1.authors.add(a1) #可以直接添加obj b1.authors.add(3) #可以直接添加id au_list=Author.objects.all() b1.authors.add(*au_list) #可以直接添加obj列表 b1.authors.add(*[1,2,3]) #可以直接添加id列表
反向添加:
a2=Author.objects.get(id=1) b2=Book.objects.get(id=2) a2.book_set.add(b2) a2.book_set.add(3) a2.book_set.add(*Book.objects.all()) a2.book_set.add(*[1,2,3,4])
多對多刪除:
多對多的刪除有兩個參數:
- clear() 清空數據
- remove() 刪除數據
正向刪除:
# 刪除id=1的書籍的所有作者 b1=Book.objects.get(id=1) b1.authors.clear() # 刪除id=2的書籍的作者id=1,2,5 b2=Book.objects.get(id=2) b2.authors.remove(1) b2.authors.remove(*[2,5])
反向刪除:
# 刪除作者id=1的所有書籍 a1=Author.objects.get(id=1) a1.book_set.clear()
