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
本身已经可以迭代了。
我有以下场景:
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
本身已经可以迭代了。