2013-07-21 71 views
2

在Postgres 9.1上使用Django 1.3。Django 1.3 - BooleanField到DateTimeField迁移失败

我的任务是将两个旧布尔字段pulledmail_report迁移到时间戳。

在试图迁移时,我得到以下错误,我不确定如何在数据库中手动删除非空约束以避免让我将所有记录强制转换为空。 django.db.utils.DatabaseError: column "pulled" cannot be cast to type timestamp with time zone

任何有助于解决这个问题的方法都不会让我手动修补我们的实时数据库,我们将不胜感激。

模型声明的变化:

 # Reporting Checked Flags 
    # pulled => Object has been processed through order_picklist 
- pulled = models.BooleanField(default=False) 
+ pulled = models.DateTimeField(blank=True, null=True, default=None) 
    # mail_report => Object has been processed through report_mailing_list 
- mail_report = models.BooleanField(default=False) 
+ mail_report = models.DateTimeField(blank=True, null=True, default=None) 
+0

我认为最好在两次分离的迁移中做到这一点:首先,从模型中删除两列,然后用新类型重新创建它们。 –

+0

@PauloBu我想我唯一的麻烦是我需要保存现有布尔的状态,所以我可以添加一个datetime.now()标记为所有当前标记为true的标记。 – DivinusVox

回答

1

你应该阅读the Data Migration section in the South's docs。在那里,他们教你如何将明文密码更改为散列密码。要做到这一点,他们需要保留当前密码的价值并将其转换。

我的建议是去,逐步与迁移喜欢这样的:

  1. 与名称创建新datetime专栏:pulled2mail_report2
  2. 创建一个数据迁移来填充取决于布尔此列在他们respectives列pulledmail_report
  3. 值创建另一个迁移删除布尔列pulledmail_report
  4. 创建最后移植到重命名pulled2mail_report2pulledmail_report

希望这个纲要和the tutorials在文档有所帮助!

+0

这将工作得很好,我用这个概念来得到我需要的东西。不幸的是,我们必须预先安装这些事务,以使我们的在线服务器尽可能少,这意味着我无法花时间迁移,更改源,迁移。所以我使用原始查询来避免Django的查询参数验证,以获取id列表,删除旧列表,创建一个新列表,并迭代id列表以初始化它们。感谢让我以正确的方向思考。 – DivinusVox

+0

好吧,我很高兴你可以反正:) –