【问题标题】:Add new field to model with value based on an existing field with South将新字段添加到模型中,其值基于现有的 South 字段
【发布时间】:2014-04-26 12:27:35
【问题描述】:

我必须根据标题的第一个字母向我的模型添加一个新字段“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 自动将初始字段设置为上面已经存在的书籍?
或者我必须编写一个脚本来更新每本书根据需要设置初始值?

【问题讨论】:

  • 我不确定在South 中是否有任何快速的方法,但如果我要这样做,我将获取所有现有的Book 对象,然后分配@987654324 @每个。当initial 字段已创建时,您在使用South 迁移后执行此操作。

标签: python django django-models django-south


【解决方案1】:

你可以通过使用南数据迁移来做到这一点refer

创建架构迁移后,您必须运行

./manage.py datamigration app_name migration_name

它会像架构迁移一样为您创建一个文件 如果你打开文件,你会看到 South 做了一个迁移的外壳;模型定义在那里, forwards() 和 backwards() 函数在那里,但两者都没有代码。我们将编写一些代码来在 forwards 函数中设置初始字段值:

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()

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2018-12-18
    相关资源
    最近更新 更多