2017-07-27 175 views
1

我有以下情形:Django的 - 如何属性移动到另一个模型,并删除它

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

这就是为什么你会得到数据迁移的参数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已经可以自行迭代。

+0

它的工作,谢谢! ps:我使用iterator()来禁用内部缓存,因为我的电脑内存不足,无论何时运行没有它的循环(这是一个非常大的数据集) – almanegra

相关问题