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
表達式包裹查詢條件,能夠在條件之間進行多種操做.於或非等,從而實現一些負責的查詢操做
若是想要實現全部價格高於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))