【问题标题】:Django AutoOneToOneField migration and existing entriesDjango AutoOneToOneField 迁移和现有条目
【发布时间】:2017-08-04 09:15:49
【问题描述】:

在开始开发新功能之前,我有这个模型:

class AppUser(models.Model):
    user = models.OneToOneField(User, primary_key=True) #Django standard user
    # And various standard data that we don't need here

现在我需要扩展我的数据库来存储更多关于我在 Django 中拥有的用户的信息,我来到 django-annoying 建立这样的关系:

class TutorialProgression(models.Model):
    has_seen_home_tutorial = models.BooleanField(default=False)
    has_seen_revision_tutorial = models.BooleanField(default=False)
    has_seen_lists_tutorial = models.BooleanField(default=False)

class AppUser(models.Model):
    user= models.OneToOneField(User, primary_key=True) #Django standard user
    # Various standard data
    tutorial_progression = AutoOneToOneField(TutorialProgression)

这里的作用是,当创建一个新的AppUser 时,一个全新的 TutorialProgression 也将是。但我对现有条目有疑问。我尝试使用这些修改迁移我的 postgres 数据库,它要求我提供一次性默认值或在我的模型中添加默认值。

我明白这一点,但我应该如何继续为每个现有的 AppUser 分配一个唯一的 TutorialProgression

【问题讨论】:

  • documentation看来你做错了——你应该从AppUser中删除tutorial_progression并将AutoOneToOneField(AppUser)添加到TutorialProgression;这样TutorialProgression 将在第一次调用时创建。

标签: python django postgresql django-models


【解决方案1】:

您需要分三个阶段执行此操作。首先,添加与null=True 的一对一并创建迁移。然后,创建数据迁移以遍历所有现有 AppUser 并为它们创建 TutorialProgressions。最后,删除 null=True 并创建最终迁移。

【讨论】:

  • 好的,所以我想有一个让迁移处理事情的一步解决方案,当您必须在本地执行此操作时,这有点烦人,然后是开发服务器,然后再次用于生产
  • 什么?您创建迁移一次,然后在任何地方运行它们。这部分不应该有任何麻烦。
猜你喜欢
  • 1970-01-01
  • 2015-02-13
  • 2019-12-24
  • 2015-10-28
  • 2021-07-22
  • 2014-11-08
  • 2019-02-14
  • 2020-04-05
  • 2018-11-01
相关资源
最近更新 更多