Django:将两列的所有值转换为绝对值

Django: convert all values of two clumn to absolute value

比方说,我有一个包含两列的产品模型,pricesold。我想将这两列的所有值转换为绝对值并保存。目前我这样做

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 万条记录的 table 来说,这花费的时间太长了。有没有更好的方法来做到这一点?

截至 , you can make use of the Abs function [Django-doc]

from django.db.models.functions import <b>Abs</b>

Product.objects.update(price=<b>Abs(</b>'price'<b>)</b>, sold=<b>Abs(</b>'sold'<b>)</b>)

这将在数据库级别进行处理,而不是在 Django/Python 级别,因此它会生成如下所示的查询:

UPDATE product
SET price=ABS(price), sold=ABS(sold)

如果你想对每条记录进行操作,应该可以只使用 F 表达式:

from django.db.models import F

Product.objects.update(price=abs(F('price')), sold=abs(F('sold')))

使用 Abs 的其他答案效率更高,但将其保留在这里,因为 F 是一种更通用的工具,用于在查询和更新中引用模型字段,这在使用 Django 开发时非常有用.

您使用 F 表达式获取字段并为所有行设置 abs 值:

from django.db.models import F
Product.objects.all().update(price = abs(F('price')), sold = abs(F('sold'))

查看文档:https://docs.djangoproject.com/en/3.0/topics/db/queries/#filters-can-reference-fields-on-the-model