概念
class F
F()是代表模型字段的值,也就是說對於一些特殊的字段的操作,我們不需要用Python把數據先取到內存中,然后操作,在存儲到db中了。
場景
例1:我們有個統計點擊量的字段,每次更新的操作其實就是把字段的值加1.
一般我們的做法是把這條記錄取出來,把相應字段加+1,然后在save,類似下面的代碼:
# Tintin filed a news story! reporter = Reporters.objects.get(name='Tintin') reporter.stories_filed += 1 reporter.save()
當我們使用了F()之后呢? 只需要一行代碼
Reporters.objects.filter(name='Tintin').update(stories_filed=F('stories_filed') + 1)
不僅代碼量少了,而且這是直接在數據中操作,效率也變高了,特別是並發的情況,減少了多線程同時操作帶來的隱患。 但是不支持字符串相加的操作
例2: 一個合同有兩個日期,一個叫做終止日期,一個叫做結束日期,現在要篩選出終止日期小於結束日期的合同。
rom django.db.models import F
from contracts.models import Contracts
contracts = Contracts.objects.filter(contract_stop_time__lt=F('end_time'))
如果沒有F對象,就沒法直接使用rom來查詢。
使用場景待續.....
