Django:使用正则表达式更新多个对象

问题描述 投票:1回答:2

我想根据'blog/'slug文档从多个对象的this字段中删除this子字符串:

>>> import re
>>> from django.db.models import F
>>> p = re.compile('blog/')
>>> Blog.objects.update(slug=p.sub('', F('slug')))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: expected string or buffer

我尝试将str()添加到最后一个字符串,并且传递时没有错误:

>>> Blog.objects.update(slug=p.sub('', str(F('slug'))))

但是它将(DEFAULT: )插入到所有对象的slug字段中。

有什么建议吗?

django django-queryset
2个回答
2
投票

您不能那样做。更新完全在数据库中完成,因此它必须可以翻译成SQL,而您的代码则不能。您需要遍历并更新:

for blog in Blog.objects.filter(slug__startswith='blog/'):
    blog.slug = blog.slug.replace('blog/', '')
    blog.save()

0
投票

有点晚,但对于今天需要解决方案的人注意:Django 2.1的新功能。

类替换

Documentation中的用法示例:

>>> from django.db.models import Value
>>> from django.db.models.functions import Replace
>>> Author.objects.create(name='Margaret Johnson')
>>> Author.objects.create(name='Margaret Smith')
>>> Author.objects.update(name=Replace('name', Value('Margaret'), Value('Margareth')))
2
>>> Author.objects.values('name')
<QuerySet [{'name': 'Margareth Johnson'}, {'name': 'Margareth Smith'}]>
© www.soinside.com 2019 - 2024. All rights reserved.