假設模型名字為Book,字段有id,name(char),page_nums(int),publication_date(datatime), readcount(int), commentcount(int)
1.基礎查詢
Book.objects.get(id=1) Book.objects.filter(page_num > 100) Book.objects.all() /Book.object.count()
2.模糊查詢
# 書名包含“西游” Book.objects.filter(name__contains='西游') # 書名以“龍”開頭 Book.objects.filter(name__startswith='龍') # 書名以“族”結尾 Book.objects.filter(name__endswith='族')
3.范圍,比較,空查詢
gt大於 (greater then) gte大於等於 (greater then equal) lt小於 (less then) lte小於等於 (less then equal) Book.objects.filter(id__in=[1,3,5]) Book.objects.filter(id__gt=3) Book.objects.filter(name__isnull=True)
4.日期查詢
查詢2019年發行的圖書
Book.objects.filter(publication_date__year=2019)
查詢2018年以后發行的圖書
Book.objects.filter(pub_date__gt='2018-1-1')
5.F對象與Q對象
from django.db.models import F, Q
常用查詢為與常量的比較,當本身的兩個屬性進行比較時需要用到F對象,例如查詢閱讀量大於評論量的書籍
Book.objects.filter(readcount__gt=F('commentcount'))
而且可以進行運算,例如閱讀量大於五倍評論量的書籍
Book.objects.filter(readcount__gt=F('commentcount')*5)
當表示多個過濾器之間的聯合查詢時,“and”可以正常查詢,但“or”需要使用Q對象,例如 閱讀量大於1000且發行時間為2018年以后 Book.objects.filter(readcount__gt=1000, publication_date__gt='2018-1-1') / Book.objects.filter(readcount__gt=1000).filter(publication_date__gt='2018-1-1')
表示"或"時只能使用Q對象 閱讀量大於1000或評論量大於200 Book.objects.filter(Q(readcount__gt=1000)|Q(commentcount__gt=200))
Q對象可以再前面加上一個“~”表示“非”,例如,發行時間不是2019年的圖書
Book.objects.filter(~Q(publication_date__year=2019))
6.聚合查詢與排序
Avg平均,Count數量,Max最大,Min最小,Sum求和 調用聚合函數需要使用aggregate()過濾器,其返回值為一個字典類型,但Count一般不使用,例如, from django.db.models import Sum, Avg, Count, Max, Min 查詢閱讀量的總和,返回為字典 Book.objects.aggregate(Sum('readcount')) >>> {'readcount__sum': 12345} 查詢一共有多少本書,返回為數字 Book.objects.count() / Book.objects.all().count() >>> 123
按照閱讀量排序,降序可以在查詢字段前面加上一個“-”來表示
Book.objects.all()。order_by("readcount")
Book.objects.all()。order_by("-readcount")
7.關聯查詢
當模型使用外鍵時就就需要使用關聯查詢,這里添加一張新的關聯表-作者一個作者對應多個圖書:Author [id, name(char), book(ForeignKey)]
由一到多的訪問語法:一對應的模型類對象.多對應的模型類名小寫_set,例如
查詢名字為裟欏雙樹作者的所有書籍,將返回一個包含所有書籍對象的查詢集
>>> author = Author.objects.get(name=“裟欏雙樹”)
>>> author.book_set.all()
由多到一的訪問語法:多對應的模型類對象.多對應的模型類中的關系類屬性名
查詢浮生物語書籍的作者
book= Book.objects.get(name=“浮生物語”)
book.author
關聯過濾查詢
8.Django中外鍵詳解
9.Django中的查詢集(QuerySet)介紹