gpt4 book ai didi

Django ORM——重要的数据库变更/数据迁移

转载 作者:行者123 更新时间:2023-11-29 12:21:51 24 4
gpt4 key购买 nike

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

举个例子,如果我想迁移自:

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)

在不丢失任何数据的情况下解决此问题的最佳方法是什么?

最佳答案

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

  1. [模式迁移] 创建 Photo
  2. 每个Content的[数据迁移]记录创建 Photophoto 记录和 content字段设置正确
  3. [模式迁移]删除字段photo来自 Content

更新:第 2 步

python manage.py datamigration <app_name> copy_photos_to_separate_model

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

编辑那个文件。编辑 forwardbackward方法。第一个在向前迁移时调用,另一个在向后迁移时调用。

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

特价orm对象表示数据库在迁移时的状态(尽管 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数据库中每个内容的记录,但这不应该是你的情况。

关于Django ORM——重要的数据库变更/数据迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17981456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com