数据迁移以替换文本字段中的单词实例?

2024-09-13 19:18:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个数据迁移,以浏览一些用于发送通知的通用模板,目的是将“word1”的所有实例都更改为“word2”“word1”既可以出现在模板的名称中,也可以出现在正文中。目前,只有一个模板的名称中有“word1”,因此我可以使用if语句轻松地更改该模板,该语句获取该确切名称并用所需名称替换它。我遇到的问题是,当“word1”出现在模板主体中时,将其替换为“word2”。另外需要注意的是,正文中出现的“word1”完全独立于名称中出现的内容

到目前为止,我已经尝试在for循环中使用带有a_notification.body.contains('word1')的if语句来查找哪些通知包含该单词。我还尝试将正文拆分为一个单词列表,用空格字符拆分文本字段,然后使用for循环检查每个单词是否等于“word1”。目前,我正在尝试使用.replace()查找实例并将其替换为所需的单词

迁移文件:

#Generated by Django 1.11.6 on 2019-07-08 20:05
from __future__ import unicode_literals

from django.db import migrations

def word1_to_word2(apps, schema_editor):
    notification = apps.get_model('hr', 'NotificationTemplate')
    for a_notification in notification.objects.all():
        #change the name of template that needs to be changed
        if a_notification.name == 'Name with word1':
            a_notification.name = 'Name with word2'

        #Loop through body of template and change the instances
        if 'word1' in a_notification.body in a_notification.body:
            a_notification.body.replace('word1', 'word2')
        a_notification.save()

class Migration(migrations.Migration):

    dependencies = [
        ('hr', '0013_rename_fieldA'),
    ]

    operations = [
        migrations.RunPython(word1_to_word2),
    ]

models.py

class Notification(models.Model):

    title = models.CharField(
        max_length=100, default="UREC Message", db_index=True)
    sender = models.ForeignKey(User)

    # Recepients
    employee_recepients = models.ManyToManyField(Employee, blank=True)

    # Email Pieces
    template = models.ForeignKey(NotificationTemplate, blank=True, null=True)
    signature = models.ForeignKey(NotificationSignature, blank=True, null=True)
    date_created = models.DateTimeField(auto_now_add=True)
    date_sent = models.DateTimeField(null=True)
    body = models.TextField(blank=True)

Tags: to名称模板trueforifmodelsmigrations
1条回答
网友
1楼 · 发布于 2024-09-13 19:18:41

这不起作用的原因是字符串是不可变的。Asome_string.replace(..)不会更改字符串,而是创建一个新字符串

因此,您可以将其称为:

a_notification.body = a_notification.body.replace('word1', 'word2')

这就是说,这是相当低效的,因为您对每个对象进行查询。由于,您可以使用^{} expression [Django-doc]进行两次批量更新:

from django.db.models import Value
from django.db.models.functions import Replace

def word1_to_word2(apps, schema_editor):
    notification = apps.get_model('hr', 'NotificationTemplate')
    notification.objects.update(name=Replace('name', Value('word1'), Value('word2')))
    notification.objects.update(body=Replace('body', Value('word1'), Value('word2')))

相关问题 更多 >