我正在编写一个数据迁移,以浏览一些用于发送通知的通用模板,目的是将“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)
这不起作用的原因是字符串是不可变的。A
some_string.replace(..)
不会更改字符串,而是创建一个新字符串因此,您可以将其称为:
这就是说,这是相当低效的,因为您对每个对象进行查询。由于django-2.1,您可以使用^{} expression [Django-doc]进行两次批量更新:
相关问题 更多 >
编程相关推荐