Django-在.update()中执行复杂的操作

时间:2018-12-17 01:37:38

标签: django django-models

我有以下模型:

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

某些full_address以“ Region”结尾。例子:

  1. 约克地区万锦市Main Street 123号
  2. 皮尔州密西沙加市Bloor Street 1号

我想从任何以其结尾的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()实现上述功能?

1 个答案:

答案 0 :(得分:5)

您可以在此处使用Query Expressions

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'的字符串 以及该字符串 end 的字符串,则这两个字符串都将替换为空字符串。似乎不太可能,但是如果要特别小心,可以使用regexp_replace代替replace,并在第一个Value(即Value(' Region$'))中使用适当的表达式以确保您只匹配要替换的零件。