20.F和Q查詢

 

F表達式

F表達式: 動態的獲取某個字段上的值.而且這個F表達式,不會真正的去數據庫中查詢數據,它至關於只是起一個標識的做用.
F表達式是用來優化ORM操做數據庫的。好比咱們要將公司全部員工的薪水都增長1000元,若是按照正常的流程,應該是先從數據庫中提取全部的員工工資到Python內存中,而後使用Python代碼在員工工資的基礎之上增長1000元,最後再保存到數據庫中。這裏面涉及的流程就是,首先從數據庫中提取數據到Python內存中,而後在Python內存中作完運算,以後再保存到數據庫中。示例代碼以下:javascript

employees = Employee.objects.all()
for employee in employees:
    employee.salary += 1000
    employee.save()


而咱們的F表達式就能夠優化這個流程,他能夠不須要先把數據從數據庫中提取出來,計算完成後再保存回去,他能夠直接執行SQL語句,就將員工的工資增長1000元。示例代碼以下:html

from djang.db.models import F
Employee.object.update(salary=F("salary")+1000)


F表達式並不會立刻從數據庫中獲取數據,而是在生成SQL語句的時候,動態的獲取傳給F表達式的值。java

好比若是想要獲取做者中,name和email相同的做者數據。若是不使用F表達式,那麼須要使用如下代碼來完成:python

authors = Author.objects.all()
    for author in authors:
        if author.name == author.email:
            print(author)


若是使用F表達式,那麼一行代碼就能夠搞定。示例代碼以下:ios

from django.db.models import F
    authors = Author.objects.filter(name=F("email"))

Q表達式

Q表達式: 使用Q表達式包裹查詢條件,能夠在條件之間進行多種操做.於或非等,從而實現一些負責的查詢操做
若是想要實現全部價格高於100元,而且評分達到9.0以上評分的圖書。那麼能夠經過如下代碼來實現:web

books = Book.objects.filter(price__gte=100,rating__gte=9)


以上這個案例是一個並集查詢,能夠簡單的經過傳遞多個條件進去來實現。
可是若是想要實現一些複雜的查詢語句,好比要查詢全部價格低於10元,或者是評分低於9分的圖書。那就沒有辦法經過傳遞多個條件進去實現了。這時候就須要使用Q表達式來實現了。示例代碼以下:數據庫

from django.db.models import Q
books = Book.objects.filter(Q(price__lte=10) | Q(rating__lte=9))


以上是進行或運算,固然還能夠進行其餘的運算,好比有&和~(非)等。一些用Q表達式的例子以下:django

from django.db.models import Q
# 獲取id等於3的圖書
books = Book.objects.filter(Q(id=3))
# 獲取id等於3,或者名字中包含文字"記"的圖書
books = Book.objects.filter(Q(id=3)|Q(name__contains("記")))
# 獲取價格大於100,而且書名中包含"記"的圖書
books = Book.objects.filter(Q(price__gte=100)&Q(name__contains("記")))
# 獲取書名包含「記」,可是id不等於3的圖書
books = Book.objects.filter(Q(name__contains='記') & ~Q(id=3))
相關文章
相關標籤/搜索