Django Mysql數據庫-F查詢和Q查詢


一、F查詢和Q查詢

F查詢:

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

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

1、查看評論數大於閱讀數的書
from django.db.models import F,Q
print(models.Book.objects.filter(commentNum__gt=F("readNum")))

2、修改操作也可以使用F函數,比如將id大於1的所有的書的價格漲價100元

print(models.Book.objects.filter(nid__gt=1).update(price=F("price")+100))
3、Django 支持 F() 對象之間以及 F() 對象和常數之間的加減乘除和取模的操作。
# 查詢評論數大於收藏數2倍的書籍
    models.Book.objects.filter(commnetNum__lt=F('keepNum')*2)

 

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

1、查詢id大於1並且評論數大於100的書
 print(models.Book.objects.filter(nid__gt=1,commentNum__gt=100))
 print(models.Book.objects.filter(nid__gt=1).filter(commentNum__gt=100))
 print(models.Book.objects.filter(Q(nid__gt=1)&Q(commentNum__gt=100)))
2、查詢評論數大於100或者閱讀數小於200的書
print(models.Book.objects.filter(Q(commentNum__gt=100)|Q(readNum__lt=200)))
Q 對象可以使用& 和| 操作符組合起來。當一個操作符在兩個Q 對象上使用時,它產生一個新的Q 對象。
3、查詢年份等於2017年或者價格大於200的書
 print(models.Book.objects.filter(Q(publishDdata__year=2017)|Q(price__gt=200)))
4、查詢年份不是2017年或者價格大於200的書
 
        
print(models.Book.objects.filter(~Q(publishDdata__year=2017)&Q(price__gt=200)))
 
        

注意:

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

 
        
bookList=models.Book.objects.filter(Q(publishDate__year=2016) | Q(publishDate__year=2017),
                                  title__icontains="python"
                                 )
 
        

 

 



 






免責聲明!

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



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