Django bulk update with string replace

前端 未结 4 600
Happy的楠姐
Happy的楠姐 2020-12-28 16:27

I am trying to update and modify a string field Django\'s ORM. The equivalent SQL to do this is:

UPDATE example_table SET string_field = REPLACE(string_fiel         


        
4条回答
  •  隐瞒了意图╮
    2020-12-28 17:10

    You could make your own F-like object to represent the string replacing in SQL. Here is a proof of concept:

    from django.db.models.expressions import ExpressionNode
    
    class StringReplaceF(ExpressionNode):
        def __init__(self, field, replace_from, replace_to):
            self.field = field
            self.replace_from = replace_from
            self.replace_to = replace_to
            super(StringReplaceF, self).__init__()
    
        def evaluate(self, evaluator, qn, connection):
            return (
                "REPLACE({}, %s, %s)".format(self.field),
                (self.replace_from, self.replace_to)
            )
    
     >>> f = StringReplaceF('string_field', 'old text', 'new text')
     >>> ExampleModel.objects.update(string_field=f)
    

    You'd need to do a bit more work with the class if you need it to behave nicely with other F objects, but then again, the existing F objects don't seem to work with strings anyway.

提交回复
热议问题