python - 带字符串替换的python Django 批量更新

  显示原文与译文双语对照的内容

我正在尝试更新和修改 Django的字符串字段 ORM 。 执行这里操作的等效SQL为:


UPDATE example_table SET string_field = REPLACE(string_field, 'old text', 'new text');



有了这个查询,我希望 old textold text more text 替换为 new textnew text more text 对于 string_field 列中的所有条目,。

虽然我希望只修改部分字段,但 F() 表达式只实现数值更改,而不是字符串替换。 我还研究了使用原始查询插件来运行上述 SQL,但这看起来像一个侧面的( 尤其是 F() 在数字上做同样的事情),我无法让它们真正地执行。

我结束了,但是当我知道有一行SQL语句执行它时,执行所有额外的查询看起来很遗憾。


for entry in ExampleModel.objects.all():


 entry.string_field = entry.string_field.replace('old text', 'new text', 1)


 entry.save()



这里特性是否在字符串的Django 中不存在? 我在文档中是否忽略了什么?

相关问题:

时间: 原作者:

使用 Django 1.9测试


from django.db.models import F, Func, Value



ExampleModel.objects.filter(<condition>).update(


 string_field=Func(


 F('string_field'),


 Value('old text'), Value('new text'),


 function='replace',


 )


)



原作者:

你可以创建自己的F -like对象来表示在SQL中替换的字符串。 下面是一个概念证明:


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)



如果你需要它与其他 F 对象配合工作,你需要做更多的工作,但是,现有的F 对象似乎并不能像以前那样使用字符串。

原作者:
...