Django - 如何将属性移动到另一个模型并将其删除

Django - How to move attribute to another model and delete it

我有以下场景:

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)
    ]

请注意,我还想从 class C 中删除该属性,因此代码如下所示:

class C():
    z = models.Integer...

class D():
    y2 = models.Integer...
    z2 = models.Integer...

看起来一切正常,对吧?是时候做出承诺了。

哦,等等!下一个执行这段代码的人会得到一个错误,因为数据迁移试图访问一个不再存在的属性(在本例中为 y)。

是否有人知道将属性复制到另一个模型 class 然后从源 class 中删除它的解决方法(不需要 .sql 文件)?

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