如何将字段从一个模型移动到另一个模型,并且仍然保留数据?

2024-10-01 15:37:11 发布

您现在位置:Python中文网/ 问答频道 /正文

为了简化,我有一个模型,比如说

class Parent(models.Model):
    field_a = models.CharField(max_length=40)

以及另一个保存图像字段的模型,它通过外键将自身与父实例绑定:

^{pr2}$

最初的计划是为父对象支持多个图片,并且每次只使用一个图片,但是现在,我希望只支持一个图片,并将其包含在父模型中,这样ParentPicture可以被销毁,并使Parent看起来是这样的:

class Parent(models.Model):
    field_a = models.CharField(max_length=40)
    picture = models.ImageField(upload_to=upload_path)

我不确定将picture字段移到新模型中,并包含来自ParentPicture的具有is_used标志的实例的最佳方法。在

有没有一种简单的方法可以用Django自动完成,或者我需要对Parent模型进行更改,迁移更改,然后运行一个脚本来遍历ParentPicture模型并进行适当的复制,然后在完成后,只使用删除ParentPicture模型?在

谢谢你的帮助/建议!在


Tags: 实例方法模型fieldmodelmodels图片length
2条回答

我认为没有一种“自动”的方式来移动字段,所以您可以:

  1. picture字段添加到Parent类中
  2. 生成并运行架构迁移
  3. 编写并运行一个data migration,用模型ParentPicture中的值填充新的picture字段
  4. 删除旧的/过时的模型/字段,生成新的模式迁移并运行它

这是一个多步骤的过程。首先,您需要将字段添加到,如下所示/管理.py迁移

class Parent(models.Model):
    field_a = models.CharField(max_length=40)    
    picture = models.ImageField(upload_to=upload_path)
    is_used = models.BooleanField(default=False)

第二步有两个选择。首先是创建一个迁移.RunPython查询ParentPicture表并用其中的值更新父表。这不涉及原始sql,但效率低下。另一方面,如果你只有几排,那也没关系。在

^{2}$

另一种方法是将migrations.RunSQLUPDATE JOIN类型的查询一起使用。如果您有大量的记录,这将是有效的,建议您使用。在mysql中,您的查询可能如下所示:

UPDATE app_parent p 
   INNER JOIN app_parentpicture pp on
      p.id = pp.parent_id
   SET p.picture = pp.picture, 
      p.is_used = pp.is_used

第三步,你真的需要在这个阶段扔掉旧桌子吗?为什么不等到做了一些彻底的测试?在

相关问题 更多 >

    热门问题