【问题标题】:Django ORM — Significant database alterations / data migrationsDjango ORM — 重要的数据库更改/数据迁移
【发布时间】:2013-08-01 15:10:33
【问题描述】:

我有一个 django 驱动的网站和一个 EC2 postgresql 服务器。该网站拥有不断增长的社区和大量用户提交的内容。在开发过程中,随着我添加新功能,模型和视图变得非常混乱。我想重新开始,重写整个程序并将一些模型和视图拆分为模块化应用程序。

举个例子,如果我想从以下位置迁移:

content.models.py

class Content(models.Model):
    user = models.ForeignKey(User)
    post = models.CharField(max_length=500)
    photo = models.ImageField(upload_to='images/%Y/%m/%d')

到:

content.models.py

class Content(models.Model):
    user = models.ForeignKey(User)
    post = models.CharField(max_length=500)

photo.models.py

    photo = models.ImageField(upload_to='images/%Y/%m/%d')
    content = models.ForeignKey(content.models.Content)

在不丢失任何数据的情况下,最好的方法是什么?

【问题讨论】:

  • 您目前使用 South 吗?
  • 是的,我一直在使用 South。

标签: django postgresql django-models django-south django-orm


【解决方案1】:

这个案子可以通过3次南迁解决:

  1. [架构迁移]创建Photo表
  2. [数据迁移] 为每个Content 记录创建一个Photo 记录,并正确设置photo 和content 字段
  3. [架构迁移] 从Content 表中删除字段photo

更新:第 2 步

python manage.py datamigration <app_name> copy_photos_to_separate_model

将在<app_name>/migrations/####_copy_photos…中创建一个新文件

编辑该文件。编辑 forward 和 backward 方法。第一个在向前迁移时调用,另一个在向后迁移时调用。

第一个从合并的模型中创建单独的照片。另一个将不得不在当时可能选择许多照片中的一张并将其压缩回Content 模型。

特殊的orm 对象表示迁移时db的状态(尽管models.py在那个时候看起来是怎样的——当部署到生产环境时,它会不同于在测试中运行迁移时的样子/开发环境)。

def forward(self, orm):
    Content = orm['<app_name>.Content']
    Photo = orm['<app_name>.Photo']
    for content in Content.objects.all():
         Photo.object.get_or_create(content=content, 
                                    defaults={'photo': content.photo})

根据表的大小,您可以尝试优化查询数量。

如果数据库中的每个内容已经有多个 Photo 记录,它会爆炸,但它不应该是你的情况。

【讨论】:

  • 第 2 步会是什么样子?除了自动迁移,我对 South 的操作不多
猜你喜欢
  • 2021-07-06
  • 2018-03-04
  • 2017-05-26
  • 2014-01-13
  • 1970-01-01
  • 2022-07-09
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
相关资源
最近更新 更多