F函數
能夠解析對現有查詢對象的引用的對象。
obj = Score.objects.get(stuid='12') obj.score += 1 obj.order.save()
執行出的SQL語句
update score set score = 60 where stuid = '12'
而我們想生成的SQL語句為
update score set score = score + 1 where stuid = '12'
此時需要使用F函數
from django.db.models import F from core.models import Order obj = Score.objects.get(stuId='12') obj.score = F('score') + 1 obj.save() #生成的sql語句為: update score set score = score + 1 where stuid = '12'
當Django程序中出現F()時,Django會使用SQL語句的方式取代標准的Python操作。
上述代碼中不管 Score.score
的值是什么,Python都不曾獲取過其值,python做的唯一的事情就是通過Django的F()函數創建了一條SQL語句然后執行而已。
需要注意的是在使用上述方法更新過數據之后需要重新加載數據來使數據庫中的值與程序中的值對應:
score_obj= Score.objects.get(StuId=keyword)
或者使用更加簡單的方法:
Score.refresh_from_db()
Q函數
作用:對對象進行復雜查詢,並支持&(and),|(or),~(not)操作符。
基本使用:
from django.db.models import Q score_obj=Score.objects.filter(Q(StuId=keyword)|Q(StuId=keyword))
如果查詢使用中帶有關鍵字查詢,Q對象一定要放在前面
Student.objects.get( Q(StuDate=date(2008, 5, 12)) | Q(StuDate=date(2018, 5, 6)), StuName__startswith='Who')