【问题标题】:DJANGO: Mass update field by adding a prefixDJANGO:通过添加前缀批量更新字段
【发布时间】:2017-03-03 07:01:27
【问题描述】:

我希望更新查询集中对象的 Django 模型字段。具体来说,我想在其中一个字段上添加一个前缀,即如果一个对象的名称像“Wilson”,我想在它前面加上“OLD”,那么它将变成“OLDWilson”。

我可以想到以下使用循环:

my_objs = MyObjects.objects.filter(name='some_name') # This has over 40000 records
for obj in my_objs:
    obj.name = 'OLD{0}'.format(obj.name)
    obj.save()

我希望有一种更优雅的方式来利用此处指定的 UPDATE 方法:Django Mass Update

类似于以下内容:

MyObjects.objects.filter(name='some_name').update(name='OLD+name_here')

关于如何实现这一点的任何指示?

【问题讨论】:

  • 通常将标志直接放入文本数据不是一个好主意。您应该创建一个字段old,如果需要,将其设置为true,并在您的视图/模板中添加OLD 文本。换句话说:划分模型和表示。
  • @Frankline 试过了吗??
  • 我昨天没有测试我的答案,是的 'OLD'+F() 返回一个错误,我想我发现了一个类似的问题,应该可以满足您的需要:stackoverflow.com/questions/8143362/…

标签: python django


【解决方案1】:

试试这样的:

    from django.db.models import F

    Myobj = MyObjects.objects.filter(name='some_name')
    Myobj.update(name='OLD'+ F('name'))

【讨论】:

  • F('name') 是否返回字符串?获取以下信息:django.db.utils.ProgrammingError: operator does not exist: unknown + character varying LINE 1: ...document" SET "name" = ('OLD' + "registr...
  • @Frankline 您对我的代码的解释一定有一些错误。我根据您提供的信息为您提供了解决方案。如果您可以提供详细信息(关于您的模型和视图),那么只有我才能进一步帮助您。
  • @Frankline 您提到的模型“MyObjects”确实有一个名为 name 的字段。对吗??
  • F 对象不支持字符串连接。 (stackoverflow.com/questions/3300944/…)
【解决方案2】:

我知道这个问题已经有将近 5 年的历史了。但是,希望这有助于让答案更加明显 - 就这样吧。

像这样使用 django.db.models.functions 中的 Concat:

from django.db.models.functions import Concat
from django.db.models import Value
MyObjects.objects.filter(name='some_name').update(name=Concat(Value'OLD', 'name'))

最后一行返回受更新影响的行数。

【讨论】:

    猜你喜欢
    • 2015-07-30
    • 2016-06-09
    • 2020-03-27
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2018-12-12
    • 2018-10-03
    相关资源
    最近更新 更多