代码之家  ›  专栏  ›  技术社区  ›  Ronen Ness Han

django从URLField迁移到外键,没有南部

  •  1
  • Ronen Ness Han  · 技术社区  · 9 年前

    我有一个模型,它有一个URLField字段,我需要进行迁移,将该字段转换为外键,其中字符串是另一个对象的唯一字段,如果该对象不存在,则创建它。

    例如,将其转为:

    class Event_UserVisit(Event_Base):
        dest_url = models.URLField(max_length=1000)
    

    在这方面:

    class Event_UserVisit(Event_Base):
        dest_url = models.ForeignKey(Page)
    

    我从未做过这样的手动迁移,也没有找到任何教程或说明来做这样的事情。

    显然,做一个简单的迁移会返回如下错误:

    django.db.utils.ProgrammingError: column "source_url_id" cannot be cast automatically to type integer
    

    最好的方法是什么?

    注意:我需要在具有大量数据的生产数据库上执行此操作,这样我就不会有很长的停机时间,也不会丢失任何数据。

    谢谢!:)

    1 回复  |  直到 9 年前
        1
  •  1
  •   Glyn Jackson    9 年前

    我不认为你可以在ORM级别一次性完成这项工作(除非有人纠正我)你可能需要创建一个新的FK dest_url2 运行迁移,然后编写脚本来迁移数据。下一步,删除 dest_url 再次运行迁移。然后重命名 目标URL 2 目标(_U) Django将在这里检测名称更改。

    然而 ,我不明白为什么要将页面上的FK ID链接到名为 目标(_U) 。页面中的PK不应是1000个最大URL!它没有顺序,会使索引变得困难,并降低应用程序的速度。这样做更有意义。。。

    class Event_UserVisit(Event_Base):
        page = models.ForeignKey(Page, related_name='eventvisits')
    

    我猜佩奇看起来像这样。。。

    class Page(models.Model):
        dest_url = models.URLField(max_length=1000)