gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:24:28 24 4
gpt4 key购买 nike

我想根据 this 从多个对象的 slug 字段中删除 'blog/' 子字符串|和 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 中使用正则表达式在查询集上一次更新多个对象,您可以使用 Func expression访问数据库中的正则表达式函数:

django.db.models import F, Func, Value


pattern = Value(r'blog(/?)') # the regex
replacement = Value(r'new-blog-slug\1') # replacement string
flags = Value('g') # regex flags

Blog.objects.update(
slug=Func(
models.F('slug'),
pattern, replacement, flags,
function='REGEXP_REPLACE',
output_field=models.TextField(),
)
)

查看您的数据库供应商文档以了解详细信息和特定功能支持。

patternreplacement 中使用原始字符串 r'' 以避免必须转义反斜杠。

使用 \nn 从 1 到 9 在 replacement 中引用匹配的子串。

您可以使用 F 表达式从每个实例的字段中提供 patternreplacementflags:

pattern = F('pattern_field')
replacement = F('replacement_field')
flags = F('flags_field')

也可以使用Func表达式进行注解。

目前有一个 open pull request在 Django 中添加正则表达式数据库函数。合并后,您可能会在 django.db.models.functions 下获得 RegexpReplaceRegexpStrIndexRegexpSubstr 函数表达式使您的代码更加简洁,并在数据库供应商之间拥有一个统一的 API。

关于Django:使用正则表达式更新多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12371675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com