django學習第82天Django多表查詢
阿新 • • 發佈:2019-01-14
一.資料庫表的建立
from app01 import models
# 多對多關係的欄位無法直接新增,系統會自動建立第三表,需要在第三張表中新增(書和作者),一對一和一對多都一樣
# models.Book.objects.create(name='西遊記', price=88, publish_date='2018-09-12', publish_id=1)
# models.Book.objects.create(name='三國演義', price=32, publish_date='2018-07-12', publish_id=2)
# models.Book.objects.create(name='紅樓夢', price=60, publish_date='2018-08-10', publish_id=2)
# models.AuthorDatail.objects.create(telephone=110,birthday='2018-6-10',addr='浦東')
# models.AuthorDatail.objects.create(telephone=111,birthday='2018-7-10',addr='杭州')
# models.AuthorDatail.objects.create(telephone=119,birthday='2015-9-15',addr='合肥')
# models.AuthorDatail.objects.filter(addr='浦東').update(telephone=155)
# models.AuthorDatail.objects.filter(pk=1).update(addr='上海')
# models.Author.objects.create(name='小猴',age=16,author_detail_id=1)
# models.Author.objects.create(name='egon',age=36,author_detail_id=2)
# models.Author.objects.create(name='陳威',age=26,author_detail_id=3)
# models.Publish.objects.create(name='南京出版社',city='南京',email=' [email protected]')
# models.Publish.objects.create(name='北京出版社',city='北京',email='[email protected]')
# 多對多新增: # 一本書2個作者 # book=models.Book.objects.get(pk=1) # author1=models.Author.objects.get(pk=1) # author2=models.Author.objects.get(pk=2) # book.authors.remove(author1,author2) # book.authors.add(author1,author2) # book.authors.set([author1,author2]) # 一本書一個作者 # book=models.Book.objects.get(pk=2) # author1=models.Author.objects.get(pk=3) # book.authors.add(author1) # 一個作者兩本書 # book=models.Book.objects.get(pk=3) # author2=models.Author.objects.get(pk=1) # book.authors.add(author2)
二.多表查詢
基於物件的跨表查詢(多次查詢) 一對一: -正向查詢按欄位 -反向查詢按表名小寫 一對多: -正向查詢按欄位(正向查詢一定會查出一個來) -反向查詢按表名小寫_set.all()(返回結果是queryset物件) 多對多: -正向查詢按欄位.all()(正向查詢一定會查出多個來) -反向查詢按表名小寫_set.all()(返回結果是queryset物件) 基於雙下劃線的跨表查詢 -在filter和values中都可以做連表操作(也就是都可以寫 __) -正向查詢按欄位 -反向查詢按表名小寫 無論以誰做基表,沒有效率之分
# 查詢所有書名裡包含紅樓的書
# res=models.Book.objects.filter(name__contains='紅樓')
# 查找出版日期是2017年的書
# res=models.Book.objects.filter(publish_date__year='2018')
# 查找出版日期是2017年的書名
# res=models.Book.objects.filter(publish_date__year='2018').values('name')
# 查找價格大於10元的書
# res=models.Book.objects.filter(price__gt=10)
# 查找價格大於10元的書名和價格
# res=models.Book.objects.filter(price__gt=10).values('name','price')
# 查詢在北京的出版社
# res=models.Publish.objects.filter(city='北京').values('name')
# 查詢作者名字裡面帶“小”字的作者
# res=models.Author.objects.filter(name__startswith='小').values('name')
# 查詢年齡大於30歲的作者
# res=models.Author.objects.filter(age__gt=30).values('name')
# 查詢手機號是155開頭的作者
# res=models.AuthorDatail.objects.filter(telephone__startswith='155').values('author__name')
# 查詢手機號是155開頭的作者的姓名和年齡
# res=models.Author.objects.filter(author_detail__telephone__startswith='155').values('name','age')
# author_detail=models.AuthorDatail.objects.get(telephone='155')
# author=models.Author.objects.get(author_detail=author_detail)
# print(author.name)
# print(author.age)
# 查詢書名是“紅樓夢”的書的出版社
# res=models.Book.objects.filter(name='紅樓夢').values('publish__name')
# 查詢書名是“紅樓夢”的書的出版社所在的城市
# res=models.Publish.objects.filter(book__name='紅樓夢').values('city')
# 查詢書名是“紅樓夢”的書的出版社的名稱
# res=models.Publish.objects.filter(book__name='紅樓夢').values('name')
# book=models.Book.objects.get(name='紅樓夢')
# author_detail=models.Author.objects.get(book=book).author_detail
# print(author_detail.addr)
# 查詢書名是“西遊記”的書的所有作者
# res=models.Book.objects.filter(name='西遊記').values('authors__name')
# 查詢書名是“西遊記”的書的作者的年齡
# res=models.Author.objects.filter(book__name='西遊記').values('age')
# 查詢書名是“紅樓夢”的書的作者的手機號碼
# res=models.Author.objects.filter(book__name='紅樓夢').values('author_detail__telephone')
# 查詢書名是“紅樓夢”的書的作者的地址
# res=models.Author.objects.filter(book__name='紅樓夢').values('author_detail__addr')
# print(res)
# book=models.Book.objects.get(name='紅樓夢')
# author_detail=models.Author.objects.get(book=book).author_detail
# print(author_detail.addr)
# 查詢書名是“紅樓夢”的書的作者的郵箱
# res=models.Author.objects.filter(book__name='紅樓夢').values('book__publish__email')