from django.db.models import F, Func, Value


class Replace(Func):
    function = 'REPLACE'

    def __init__(self, expression, text, replacement=None):
        if not hasattr(expression, 'resolve_expression'):
            raise ValueError('Please pass a valid expression')
        if text is None:
            raise ValueError('Replacing null does not seem sane ...')
        self.text = Value(text)
        self.replacement = Value('' if replacement is None else replacement)
        self.expression = expression
        super().__init__(self.expression, self.text, self.replacement)


# it's then possible to use it to replace text in expressions:
Customer.objects.filter(name='Bert').update(name=Replace(F('name'), 'Bert', 'Ernie')