首页 > 解决方案 > Django - 在 .update() 中执行复杂的操作

问题描述

我有以下模型:

class Address(models.Model):
    full_address = models.CharField(max_length=100)

有些full_address以“地区”结尾。例子:

  1. 123 Main Street, 万锦市, 约克区
  2. 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()吗?

标签: djangodjango-models

解决方案


您可以在此处使用查询表达式

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使用适当的表达式,以确保你只匹配你想要替换的一个部分。ValueValue(' Region$')


推荐阅读