[TOC]python
from django.test import TestCase import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings") import django django.setup()
咱們如今models文件中建立好Book,Publish,Author,AuthorDetail這四張表sql
create方法django
models.AuthorDetail.objects.create(phone='110', email='xxx@qq.com')models.AuthorDetail.objects.create(phone='120', email='qqq@qq.com')models.Author.objects.create(name='馮*內古特', age=80, author_detail_id=1)models.Author.objects.create(name='菲茨傑拉德', age=44, author_detail_id=2)models.Book.objects.create(title='了不得的蓋茨比', price=28.8, book_type='文學', publish_id=2)
pk會自動幫你查找到當前表的主鍵字段,因此後期咱們都是用pk來指代主鍵字段app
filter查詢出來的結果是一個Queryset對象測試
只要是queryset對象就能夠無限制的調用queryset的方法spa
res = models.Books.objects.filter(pk=1).filter().filter().filter().filter()code
只要是queryset對象就能夠點query查看當前結果內部對應的sql語句對象
res.query排序
方式一rem
models.Book.objects.filter(pk=2).update(price=29.8)
方式二(不推薦使用)
# 利用對象的修改 內部實際上是重頭到位將數據的全部字段都從新寫一遍 book_obj = models.Books.objects.get(pk=1) book_obj.price = 28.8 book_obj.save()
get和filter的區別
filter獲取到的是一個queryset對象,相似於一個列表
get獲取到的直接就是數據對象自己
當條件不存在的狀況下 filter不報錯直接返回一個空 推薦使用filter方法 get直接報錯 因此不推薦使用get方法
models.Book.objects.filter(pk=3).delete()
book_obj = models.Book.objects.get(pk=3) book_obj.delete()
13個方法
方法 | 做用 | 示例 |
---|---|---|
all() | 查詢全部 | models.Book.objects.all() |
filter() | 篩選 | models.Book.objects.filter(pk=1) |
get() | 篩選(不存在會報錯) | models.Book.objects.get(pk=1) |
first() | 取queryset第一個數據對象 | models.Book.objects.filter(publish_id=2).first() |
last() | 取queryset最後一個數據對象 | models.Book.objects.filter(publish_id=2).last() |
count() | 統計數據個數 | models.Book.objects.count() |
values() | 獲取指定字段的值(列表套字典) | models.Book.objects.values('title', 'price') |
values_list() | 獲取指定字段的值(列表套元組) | models.Book.objects.values_list('title', 'price') |
order_by() | 按照指定的字段排序 | models.Book.objects.all().order_by('price') 字段前面加符號表示降序 |
reverse() | 顛倒順序(前提是已經排好序) | models.Book.objects.all().order_by('price').reverse() |
exclude() | 排除指定的字段的值 | models.Book.objects.all().excl(title='2081') |
exists() | 判斷查詢結果是否有值 | models.Book.objects.filter(pk=1).exists() |
diistinct() | 對查詢結果進行去重 | models.Book.objects.values('title', 'price').distinct() |
雙下劃線
# 查詢價格大於30的書籍 res = models.Book.objects.filter(price__gt=30) print(res) # 查詢價格小於30的書籍 res = models.Book.objects.filter(price__lt=30) print(res) # 查詢價格大於等於30的書籍 # 對數字精確度不敏感? res = models.Book.objects.filter(price__gte=30) print(res) # 查詢價格小於等於30的書籍 res = models.Book.objects.filter(price__lte=30) print(res) # 查詢價格是20或者30或者50的書籍 res = models.Book.objects.filter(price__in=[20, 30, 50]) print(res) # 查詢價格在20到50之間的書籍(顧頭又顧尾) res = models.Book.objects.filter(price__range=(20, 50)) print(res) # 查詢註冊日期是2019的用戶 res = models.User.objects.filter(register_time__year='2019') print(res) # 查詢註冊日期是11月份的用戶 res = models.User.objects.filter(register_time__month='11') # 模糊查詢 # 查詢書籍是與霍開頭的書 res = models.Book.objects.filter(title__startswith='霍') print(res) # 查詢書籍是以情結尾的書 res = models.Book.objects.filter(title__endswith='情') print(res) # 查詢書籍中含有p字母的書 res = models.Book.objects.filter(title__contains='p') # 默認區分大小寫 res = model.Book.objects.filter(title__icontains='P') # 忽略大小寫 print(res)
增
# 方式一 models.Book.objects.create(title='了不得的蓋茨比', price=28.8, book_type='文學', publish_id=2) # 方式二 publish_obj = models.Publish.objects.filter(pk=2).first() models.Book.objects.create(title='了不得的蓋茨比', price=28.8, book_type='文學', publish=publish_obj)
改
# 方式一 models.Book.objects.filter(pk=2).update(publish_id=1) # 方式二 publish_obj = models.Publish.objects.filter(pk=1).first() models.Book.objects.filter(pk=1).update(publish=publish_obj)
刪
models.Publish.objects.filter(pk=1).delete() # 默認就是級聯刪除 級聯更新
增
# 方式一 book_obj = models.Book.objects.filter(pk=2).first() book_obj.author.add(1,3) # book_obj.author已經跨到第三張表了 # 方式二 book_obj = models.Book.objects.filter(pk=2).first() author_obj = models.Book.objects.filter(pk=1).first() author_obj1 = models.Book.objects.filter(pk=3).first() book_obj.author.add(author_obj, author_obj1)
add方法可以朝第三張關係表添加數據
即支持傳數字
add(1, 3)
也支持傳對象
add(author_obj, author_obj1)
而且能夠多個
改
# 方式一 book_obj = models.Book.objects.filter(pk=2).first() book_obj.author.set([4,5]) # 方式二 book_obj = models.Book.objects.filter(pk=2).first() author_obj = models.Book.objects.filter(pk=4).first() author_obj1 = models.Book.objects.filter(pk=5).first() book_obj.author.set((author_obj, author_obj1))
set修改多對多關係表中的數據
既能夠傳數字也能夠傳對象
可是須要注意的是括號內必須是迭代對象
都支持多個
刪
# 方式一 book_obj = models.Book.objects.filter(pk=2).first() book_obj.author.remove(1,3) # book_obj.author已經跨到第三張表了 # 方式二 book_obj = models.Book.objects.filter(pk=2).first() author_obj = models.Book.objects.filter(pk=1).first() author_obj1 = models.Book.objects.filter(pk=3).first() book_obj.author.remove(author_obj, author_obj1)
清空
book_obj = models.Book.objects.filter(pk=2).first() book_obj.author.clear()
clear清空書籍相關的全部記錄,括號內不須要傳遞參數
正反向查詢
關係字段在哪張表裏,由這張表查另外一張表就是正向,不然就是反向
book_obj = models.Book.objects.filter(pk=2).first() print(book_obj.publish.name)
book_obj = models.Book.objects.filter(pk=2).first() print(book_obj.author.all().values('name'))
author_obj = models.Author.objects.filter().first() print(author_obj.author_detail.phone)
注意
何時要加all
當正向查詢點擊外鍵字段數據有多個的狀況下,須要.all()
app01.Author.None 一旦看到該結果,只須要加.all()便可
反向查詢
publish_obj = models.Publish.objects.filter(name='南方出版社').first() print(publish_obj.book_set.all())
author_obj = models.Author.objects.filter(name='jason').first() print(author_obj.book_set.all())
author_detail_obj = models.AuthorDetail.objects.filter(phone='120').first() author_detail_obj.author_set.name
# 正向 res = models.Book.objects.filter(pk=2).values('publish__name') print(res) # 反向 res = models.Publish.objects.filter(book__pk=2).values('name') print(res)
# 正向 res = models.Book.objects.filter(pk=2).values('author__name', 'author__email') print(res) # 反向 res = models.Author.objects.filter(book__pk=2).values('name', 'email') print(res)
# 正向 res = models.Author.objects.filter(name='egon').values('author_detail__addr') print(res) # 反向 res = models.AuthorDetail.filter(author__name='egon').values('addr') print(res)
# 反向 res = models.Publish.objects.filter(name='東方出版社').values('book__title') print(res) # 正向 res = models.Book.objects.filter(publish__name='東方出版社').values('title') print(res)
# 正向 res = models.Book.objects.filter(pk=2).values('author__author_detail__phone') print(res) # 反向 res = models.Author.objects.filter(book__pk=2).values('author_detail__phone') print(res) res = models.AuthorDetail.objects.filter(author__book__pk=2).values('phone') print(res)