使用South为模型添加新字段,值基于现有字段

0 投票
1 回答
970 浏览
提问于 2025-04-18 04:21

我需要在我的模型中添加一个新的字段“initial”,这个字段的值是书名的第一个字母。
我知道我可以直接添加这个新字段,然后重写save()方法,让它自动保存这个首字母,并使用South工具来进行数据迁移,像下面这样。

models.py

class Book(models.Model):
    ...
    name = models.CharField(max_length=255, primary_key=True)
    ...
    initial = models.CharField(max_length=1, blank=True, default='')

    def save(self, *args, **kwargs):
        if self.name[0].isalpha():
            self.initial = self.name[0]
        else:
            self.initial = '#'
        super(Manga, self).save(*args, **kwargs)

但是,已经存在的书籍在数据库里怎么办呢?
有没有办法让South自动为这些已经存在的书籍设置“initial”字段的值,就像上面说的那样?
还是说我必须写一个脚本,手动更新每一本书,把“initial”字段设置成我想要的值?

1 个回答

0

你可以通过使用 South 数据迁移来实现这个功能,可以参考这里

在创建了架构迁移之后,你需要运行:

./manage.py datamigration app_name migration_name

这会为你创建一个文件,类似于架构迁移的文件。如果你打开这个文件,你会看到 South 已经为迁移准备好了一个框架;模型的定义在里面,前进(forwards())和后退(backwards())的函数也在,但这两个函数里面没有任何代码。接下来,我们要在前进函数里面写一些代码,以设置初始字段的值:

def forwards(self, orm):
    for book in orm.Book.objects.all():
        if book.name[0].isalpha():
            book.initial = book.name[0]
        else:
            book.initial = '#'
        book.save()

撰写回答