Django的Replace可以用来一次替换多个子字符串吗?

wgx48brx  于 2023-01-10  发布在  Go
关注(0)|答案(1)|浏览(134)

在Django中,我可以有如下的查询:

from django.db.models import Value
from django.db.models.functions import Replace

MyModel.objects.update(description=Replace("description", Value("old_1"), Value("new_1")))
MyModel.objects.update(description=Replace("description", Value("old_2"), Value("new_2")))

第一个.update将遍历数据库,在description字段中查找“old_1”子字符串,并用“new_1”子字符串替换它;第二个.update调用将对old_2子字符串执行相同的操作,用new_2子字符串替换它。
这可以在单个查询中完成吗?

lo8azlld

lo8azlld1#

您可以执行**Replace**[Django-doc]两次:

from django.db.models import Value
from django.db.models.functions import Replace

MyModel.objects.update(
    description=Replace(
        Replace('description', Value('old1'), Value('new1')),
        Value('old2'),
        Value('new2'),
    )
)

我们可以用效用函数来构建这样的表达式:

from functools import reduce

from django.db.models.functions import Replace

def MultiReplace(expr0, *kvs):
    return reduce(lambda e, kv: Replace(e, *kv), kvs, expr0)

然后,我们可以将这些嵌套为:

MyModel.objects.update(
    description=MultiReplace(
        'description',
        (Value('old1'), Value('new1')),
        (Value('old2'), Value('new2')),
    )
)

相关问题