1. 程式人生 > >django學習第82天Django多表查詢

django學習第82天Django多表查詢

一.資料庫表的建立


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')