Home > Software design >  Can Django's Replace be used to replace multiple substrings at once?
Can Django's Replace be used to replace multiple substrings at once?

Time:01-10

In Django, I can have queries that look like this:

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")))

The first .update will go through the database, look for the "old_1" substring in the description field, and replace it with the "new_1" substring. The second .update call will do the same thing for the old_2 substring, replacing it with the new_2 substring.

Can this be done in a single query?

CodePudding user response:

You can perform the Replace [Django-doc] twice:

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

We can make a utility function to build such expression:

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)

Then we can nest these with:

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