我有以下情况:
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文件)将属性复制到另一个模型类,然后从源类中删除它吗?
答案 0 :(得分:0)
这就是为什么你得到数据迁移的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
已经可以自行迭代。