Django:将两列的所有值转换为绝对值
Django: convert all values of two clumn to absolute value
比方说,我有一个包含两列的产品模型,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 万条记录的 table 来说,这花费的时间太长了。有没有更好的方法来做到这一点?
截至 django-2.2, 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
比方说,我有一个包含两列的产品模型,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 万条记录的 table 来说,这花费的时间太长了。有没有更好的方法来做到这一点?
截至 django-2.2, 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