【问题标题】:Django: convert all values of two clumn to absolute valueDjango:将两列的所有值转换为绝对值
【发布时间】:2020-07-28 23:23:46
【问题描述】:

可以说,我有一个包含两列的产品模型,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


    【解决方案1】:

    截至,您可以使用Abs function [Django-doc]

    from django.db.models.functions import Abs
    
    Product.objects.update(price=Abs('price'), sold=Abs('sold'))

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

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

    【讨论】:

    • 这是一个更好的答案。没有意识到 Abs 可以用于更新,出于某种原因,我认为它仅用于查询过滤和注释
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-07-16
        • 1970-01-01
        • 1970-01-01
        • 2018-02-20
        • 2014-08-01
        • 2022-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多