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

问题描述 投票:1回答:3

假设我有一个产品模型,其中有两列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万条记录的表来说,这花费了太长时间。有没有更好的方法可以做到这一点?

python django django-queryset query-performance
3个回答
2
投票

开始,您可以使用Abs function [Django-doc]

Abs

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

from django.db.models.functions import Abs

Product.objects.update(price=Abs('price'), sold=Abs('sold'))

0
投票

如果要对每条记录进行操作,都应该只能使用F表达式:

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

0
投票

您使用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'))

© www.soinside.com 2019 - 2024. All rights reserved.