【问题标题】:django migrate from URLField to foreign key without southdjango 从 URLField 迁移到没有南的外键
【发布时间】:2015-09-20 07:57:23
【问题描述】:

我有一个具有 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

最好的方法是什么?

注意:我需要在具有大量数据的生产数据库上执行此操作,因此我不能长时间停机并且不能丢失任何数据。

谢谢! :)

【问题讨论】:

  • 你使用的是什么版本的 Django?在 Django 1.7+ 版本中,syncdb 已被“弃用”并被 migrate 取代。建议在 South 上使用 Django 自己的内置迁移工具。两者都是由 Andrew Godwin 创建的。 docs.djangoproject.com/en/1.8/topics/migrations
  • 1.8,但我使用的是迁移,而不是 syncdb,没有南。我认为这个问题是合法的,例如它不是我对 django 做错的事情,它只是我不知道如何用 django 做的事情。将 URL 字段转换为现有/新对象的外键并非易事。谢谢:)

标签: django django-models django-migrations


【解决方案1】:

我认为您不能一次性在 ORM 级别执行此操作(除非有人纠正我)您可能需要创建一个新的 FK,可能是 dest_url2 运行迁移,然后编写一个脚本来迁移数据。接下来,删除dest_url 再次运行迁移。然后将dest_url2重命名为dest_url,Django会在这里检测到名称的变化。

但是,我不明白您为什么要将页面上的 FK ID 链接到名为 dest_url 的字段。页面中的 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)

【讨论】:

  • 嗨,Glyn Jackson,当你回答时,我已经按照你的建议做了很多,所以我很高兴看到我采取了正确的方法。关于PK的事情-我说“主键”只是为了保持简单,但它并不是真正的PK,只是一个独特的领域。页面仍然使用内置的整数 PK。 ;) 不管怎样,给小费+1。
猜你喜欢
  • 2014-02-21
  • 1970-01-01
  • 2011-04-03
  • 2014-10-28
  • 2012-04-17
  • 2012-06-05
  • 2019-02-14
  • 1970-01-01
相关资源
最近更新 更多