假设我有一个产品模型,其中有两列price
,sold
。我想将这两列的所有值都转换为绝对值并保存。目前,我正在这样做
for obj in Product.objects.all():
obj.price = abs(obj.price)
obj.sold = abs(obj.sold)
Product.objects.bulk_update(all_obj, ['price', 'sold'])
尽管这有效,但是对于一个可以拥有50万条记录的表来说,这花费了太长时间。有没有更好的方法可以做到这一点?
从django-2.2开始,您可以使用Abs
function [Django-doc]:
Abs
这将在数据库级别而不是在Django / Python级别进行处理,因此它将进行如下查询:
from django.db.models.functions import Abs
Product.objects.update(price=Abs('price'), sold=Abs('sold'))
如果要对每条记录进行操作,都应该只能使用F表达式:
UPDATE product
SET price=ABS(price), sold=ABS(sold)
您使用from django.db.models import F
Product.objects.update(price=abs(F('price')), sold=abs(F('sold')))
表达式获取字段并为所有行设置绝对值:
F
请参阅文档:from django.db.models import F
Product.objects.all().update(price = abs(F('price')), sold = abs(F('sold'))