django F和Q函數 使用F方法更新一個對象或多個對象的某個字段有什麼優點?

使用F方法更新一個對象或多個對象的某個字段有什麼優點?

通常情況下我們在更新數據時需要先從數據庫裏將原數據取出後放在內存裏,然後編輯某些字段或屬性,最後提交更新數據庫。使用F方法則可以幫助我們避免將所有數據先載入內存,而是直接生成SQL語句更新數據庫。

假如我們需要對所有產品的價格漲20%,我們通常做法如下。當產品很少的時候,對網站性能沒影響。但如果產品數量非常多,把它們信息全部先載入內存會造成很大性能浪費。


products = Product.objects.all()
for product in products:
    product.price *= 1.2
    product.save()

使用F方法可以解決上述問題。我們直接可以更新數據庫,而不必將所有產品載入內存。

from django.db.models import F
Product.objects.update(price=F('price') * 1.2)


product = Product.objects.get(pk=5009)
product.price = F('price') * 1.2
product.save()

但值得注意的是當你使用F方法對某個對象字段進行更新後,需要使用refresh_from_db()方法後才能獲取最新的字段信息(非常重要!)。如下所示:

product.price = F('price') + 1
product.save()
print(product.price)            # <CombinedExpression: F(price) + Value(1)>
product.refresh_from_db()
print(product.price)            # Decimal('13.00')

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章