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

Django-在.update()中执行复杂的操作,django,django-models,Django,Django Models,我有以下型号: class Address(models.Model): full_address = models.CharField(max_length=100) 一些完整地址以“Region”结尾。示例: 约克地区马克姆大街123号 皮尔地区米西索加布鲁尔街1号 我想从任何以“Region”结尾的full\u address字段中删除“Region” 这里有一个可能的解决方案,但速度很慢,因为您需要逐个检查每个地址: for i in Address.objects.filte

我有以下型号:

class Address(models.Model):
    full_address = models.CharField(max_length=100)
一些
完整地址
以“Region”结尾。示例:

  • 约克地区马克姆大街123号
  • 皮尔地区米西索加布鲁尔街1号
  • 我想从任何以“Region”结尾的
    full\u address
    字段中删除“Region”

    这里有一个可能的解决方案,但速度很慢,因为您需要逐个检查每个
    地址:

    for i in Address.objects.filter(full_address__endswith=' Region'):
        i.full_address = i.full_address[:-7]
        i.save()
    
    是否有某种方法可以使用
    Address.objects.update()
    实现上述功能?

    您可以在此处使用

    请注意,如果您认为可以得到一个包含文本
    “Region”
    以及以该字符串结尾的字符串,那么这将用空字符串替换这两个字符串。这似乎不太可能,但如果您想特别小心,可以使用
    regexp\u replace
    而不是
    replace
    ,并对第一个
    值使用适当的表达式(即
    值('Region$)
    ),以确保只匹配要替换的一个零件。

    您可以在此处使用


    请注意,如果您认为可以得到一个包含文本
    “Region”
    以及以该字符串结尾的字符串,那么这将用空字符串替换这两个字符串。这似乎不太可能,但如果您想特别小心,可以使用
    regexp\u replace
    而不是
    replace
    ,并对第一个
    值使用适当的表达式(即
    值('Region$)
    )确保您只匹配要更换的一个零件。

    是的,我必须使用
    regexp\u replace
    ,因为
    “Region”
    可能以类似
    “Regional Road 25”的形式出现在街道名称中。
    是的,我必须使用
    regexp\u replace
    ,因为
    'Region'
    可能以类似
    'Regional Road 25'
    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',
        )
    )