Django ORMF和Q查詢


F查詢

在上面所有的例子中,我們構造的過濾器都只是將字段值與某個常量做比較。如果我們要對兩個字段的值做比較,那該怎么做呢?

Django 提供 F() 來做這樣的比較。F() 的實例可以在查詢中引用字段,來比較同一個 model 實例中兩個不同字段的值。

查詢書id大於\小於價格的書籍

models.Book.objects.filter(id__gt=F("price")) <QuerySet []> models.Book.objects.filter(id__lt=F("price")) <QuerySet [<Book: 書一>, <Book: 書二>, <Book: 書三>, <Book: 書四>, <Book: 書五>, <Book: 書六>]>

 

Django 支持 F() 對象之間以及 F() 對象和常數之間的加減乘除和取模的操作。 
這里寫圖片描述

models.Book.objects.filter(id__lt=F("price")/2) <QuerySet [<Book: 書一>, <Book: 書二>, <Book: 書三>, <Book: 書四>, <Book: 書五>]>

 

修改操作也可以使用F函數,比如將每一本書的價格提高30元

models.Book.objects.all().update(price=F("price")+30)

 

修改之后的截圖如下: 
這里寫圖片描述

Concat鏈接

from django.db.models.functions import Concat from django.db.models import Value models.Book.objects.update(title=Concat(F("title"),Value("("),Value("第"),Value(")")))

修改之后的表如下: 
這里寫圖片描述

Q查詢

filter() 等方法中的關鍵字參數查詢都是一起進行“AND” 的。 如果你需要執行更復雜的查詢(例如OR語句),你可以使用Q對象

查詢作者名是小仙女或小魔女的

models.Author.objects.filter(Q(name="小一") | Q(name="小三")) <QuerySet [<Author: 小一>, <Author: 小三>]> 

 

你可以組合& 和| 操作符以及使用括號進行分組來編寫任意復雜的Q 對象。同時,Q 對象可以使用~ 操作符取反,這允許組合正常的查詢和取反(NOT) 查詢

查詢作者名字是小仙女並且不是2018年出版的書的書名。

models.Book.objects.filter(Q(author__name="小一") & ~Q(publish_day__year=2018)).values_list("title") <QuerySet [('書一',)]>

 

查詢函數可以混合使用Q 對象和關鍵字參數。所有提供給查詢函數的參數(關鍵字參數或Q 對象)都將”AND”在一起。但是,如果出現Q 對象,它必須位於所有關鍵字參數的前面

models.Book.objects.filter(Q(publish_day__year=2018) | Q(publish_day__year=2017), title__icontains="書") <QuerySet [<Book: 書一>, <Book: 書二>, <Book: 書三(第)>, <Book: 書四(第)>, <Book: 書五(第)>, <Book: 書六(第)>]> 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM