django - Django - 在 .update() 中执行复杂的操作
问题描述
我有以下模型:
class Address(models.Model):
full_address = models.CharField(max_length=100)
有些full_address
以“地区”结尾。例子:
- 123 Main Street, 万锦市, 约克区
- 1 Bloor Street, 密西沙加, 皮尔区
我想从full_address
以它结尾的任何字段中删除“区域”。
这是一种可能的解决方案,但速度很慢,因为您需要Address
逐个检查:
for i in Address.objects.filter(full_address__endswith=' Region'):
i.full_address = i.full_address[:-7]
i.save()
有什么方法可以实现上述功能Address.objects.update()
吗?
解决方案
您可以在此处使用查询表达式
from django.db.models import F, Func, Value
Address.objects.filter(full_address__endswith=' Region').update(
full_address=Func(
F('full_address'),
Value(' Region'), Value(''),
function='replace',
)
)
请注意,如果您认为您可以获得一个包含文本' Region'
并以该字符串结尾的字符串,这将用空字符串替换两者。这似乎不太可能,但如果你想特别小心,你可以使用regexp_replace
而不是第一个(即)replace
使用适当的表达式,以确保你只匹配你想要替换的一个部分。Value
Value(' Region$')
推荐阅读
- python - QThread 没有并行运行
- sql - 如何使用 select 显示 SQL 中的工作年限?
- javascript - Object.keys = for 循环
- google-cloud-platform - 删除数据时出现云构建问题
- ruby-on-rails - 在 Rails 会话中存储类的实例会导致 TypeError 异常
- python - 在 Python 中使用 Google 翻译库时出现 Json 错误
- assembly - 返回在 MIPS 中删除了字符的字符串
- reactjs - 可以在反应应用程序中使用包含锚标记的引导导航选项卡而不是反应路由器的链接吗
- javascript - (节点:4677)UnhandledPromiseRejectionWarning:未处理的承诺拒绝
- c - Efficient Assembly multiplication