通过南方迁移现有应用程序

时间:2013-08-19 18:04:59

标签: python django django-south

我有以下型号 -

class ToDo(models.Model):

    todo_title = models.CharField(null=True, blank=True, max_length=200)
    todo_status = models.IntegerField(choices=TASK_STATUS, null=True, blank=True)
    assigned_to = models.ManyToManyField(OrgStaff, null=True, blank=True, related_name='assigned_to')
    assigned_by = models.ManyToManyField(OrgStaff, null=True, blank=True, related_name='assigned_by')
    assigned_time = models.DateTimeField(auto_now_add=True)
    completed_time = models.DateTimeField(null=True, blank=True)

然后我运行python manage.py convert_to_south todoapp,其中 todoapp 是其中的名称 应用程序。然后我运行python manage.py migrate todoapp.

完成后,我在上面的模型中添加了另一个字段 -

class ToDo(models.Model):

    todo_title = models.CharField(null=True, blank=True, max_length=200)
    todo_slug = models.SlugField(null=True, blank=True)
    todo_status = models.IntegerField(choices=TASK_STATUS, null=True, blank=True)
    assigned_to = models.ManyToManyField(OrgStaff, null=True, blank=True, related_name='assigned_to')
    assigned_by = models.ManyToManyField(OrgStaff, null=True, blank=True, related_name='assigned_by')
    assigned_time = models.DateTimeField(auto_now_add=True)
    completed_time = models.DateTimeField(null=True, blank=True)

现在我进行架构管理 - python manage.py schemamigration todoapp --auto然后python manage.py migrate todoapp执行此操作会出现以下错误 -

Running migrations for taskbase:
 - Migrating forwards to 0002_auto__add_field_todo_todo_slug.
 > taskbase:0002_auto__add_field_todo_todo_slug
KeyError: u'todo_title'

知道我收到此错误的原因吗? 我撞了我的头,但无法找到原因。

1 个答案:

答案 0 :(得分:0)

使用'todo_'为“标题”和“状态”添加前缀可能会导致与表字段名称发生冲突。实际上,在数据库中,Django正在命名字段todoapp_todo_todo_status,而南方可能只会感到困惑。南方在内部做了一些创造性的事情,因此碰撞。我建议尝试:

class ToDo(models.Model):

    title = models.CharField(null=True, blank=True, max_length=200)
    status = models.IntegerField(choices=TASK_STATUS, null=True, blank=True)
    assigned_to = models.ManyToManyField(OrgStaff, null=True, blank=True, related_name='assigned_to')
    assigned_by = models.ManyToManyField(OrgStaff, null=True, blank=True, related_name='assigned_by')
    assigned_time = models.DateTimeField(auto_now_add=True)
    completed_time = models.DateTimeField(null=True, blank=True)

我想变得迂腐,我还可以指出 todoapp 应该被称为 todos ,但这对你的项目没有任何影响。