Django - 如何将属性移动到另一个模型并删除它
Posted
技术标签:
【中文标题】Django - 如何将属性移动到另一个模型并删除它【英文标题】:Django - How to move attribute to another model and delete it 【发布时间】:2018-01-03 14:13:05 【问题描述】:我有以下场景:
class C():
y = models.Integer...
z = models.Integer...
class D():
y2 = models.Integer...
z2 = models.Integer...
我想从属性 y 复制数据并将其粘贴到 y2。好的,我创建了一个可以完成工作的数据迁移。简而言之:
from greatapp.models import C, D
class Migration(migrations.Migration):
def move_info_to_class_d(apps, schema_editor):
objs = C.objects.all()
for obj in objs.iterator():
d = D.objects.create(y2=obj.y)
operations = [
migrations.RunPython(move_info_to_class_d)
]
请注意,我还想从 C 类中删除该属性,因此代码如下所示:
class C():
z = models.Integer...
class D():
y2 = models.Integer...
z2 = models.Integer...
一切看起来都不错,对吧?是时候承诺了。
哦,等等!下一个执行此代码的人将收到错误,因为数据迁移正在尝试访问不再存在的属性(在本例中为 y)。
有没有人知道一种解决方法(不需要 .sql 文件)将属性复制到另一个模型类,然后从源类中删除它?
【问题讨论】:
【参考方案1】:这就是您在数据迁移中获得apps
参数的原因。它保存模型的定义,就像您创建数据迁移时一样。
也是这样
def move_info_to_class_d(apps, schema_editor):
C = apps.get_model('yourappname', 'C')
D = apps.get_model('yourappname', 'D')
objs = C.objects.all()
for obj in objs.iterator():
d = D.objects.create(y2=obj.y)
它会正常工作(只要您创建在此之后删除 C.y 的迁移)。
编辑:哦,objs.iterator()
是不必要的,objs
本身已经可以迭代了。
【讨论】:
成功了,谢谢! ps.:我使用 iterator() 禁用内部缓存,因为我的电脑在没有它的情况下运行循环时内存不足(它是一个非常大的数据集) @almanegra 使用.iterator()
对大型数据集有帮助吗?你有解释的网址吗?以上是关于Django - 如何将属性移动到另一个模型并删除它的主要内容,如果未能解决你的问题,请参考以下文章
如何将自定义用户模型迁移到 Django 中的不同应用程序?
django - 如何将实际图像文件从一个模型复制到另一个模型?
如何在 Django 中使用 South 将数据从一个模型迁移到另一个模型?