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

标签 python django

在 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将遍历数据库,在描述字段中查找“old_1”子字符串,并将其替换为“new_1”子字符串。第二个 .update 调用将对 old_2 子字符串执行相同的操作,并将其替换为 new_2 子字符串。

这可以在单个查询中完成吗?

最佳答案

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

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

MyModel.objects.update(
    description=Replace(
        Replace('description', Value('old<sub>1</sub>'), Value('new<sub>1</sub>')),
        Value('old<sub>2</sub>'),
        Value('new<sub>2</sub>'),
    )
)

我们可以创建一个实用函数来构建这样的表达式:

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')),
    )
)

关于python - Django的Replace可以用来一次替换多个子字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75061330/

相关文章:

python - 在列表中添加项目,直到其总和超过阈值

python - secret 文字游戏 - Python

按内部列表的最后一项对列表列表进行排序的 pythonic 方法

python - 在 Django 模板中将列表转换为逗号分隔值

Django多语言网站: how to?

python - 在 Python 列表中创建子列表

python - 从 pyodbc 插入 SQL Server 时出现 "Invalid object name"错误

javascript - 有没有办法用 javascript 变量索引 Django/Jinja 列表?

python - Send_mail 未发送邮件至 gmail id。 [ Django ]

python - 防止在 Django 中自动转义自定义模板标签