【问题标题】:Can Django's Replace be used to replace multiple substrings at once?Django 的 Replace 可以用于一次替换多个子字符串吗?
【发布时间】:2023-01-10 02:17:55
【问题描述】:

在 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 子字符串。

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

【问题讨论】:

    标签: python django


    【解决方案1】:

    您可以执行 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, (k, v): Replace(e, k, v), kvs, expr0)

    然后我们可以将它们嵌套:

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

    【讨论】:

    • 好的。有没有更清洁的方法来做到这一点?如果您想替换 10 个子字符串,嵌套会很快变得非常疯狂。
    • @John:是的,我们可以为此定义一个“折叠”/“减少”模式。见更新。
    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2011-07-01
    • 2015-05-11
    • 1970-01-01
    相关资源
    最近更新 更多