Django 使用F()对象don';t在数据迁移中起作用
我正在尝试使用updatequeryset方法创建数据迁移。我的案例有一个复杂的迁移过程,因此我面临以下问题。简单的例子Django 使用F()对象don';t在数据迁移中起作用,django,django-migrations,Django,Django Migrations,我正在尝试使用updatequeryset方法创建数据迁移。我的案例有一个复杂的迁移过程,因此我面临以下问题。简单的例子 from __future__ import unicode_literals from django.db import migrations, models def move_data(apps, schema_editor): MyModel = apps.get_model("my_app", 'MyModel') MyModel.objects
from __future__ import unicode_literals
from django.db import migrations, models
def move_data(apps, schema_editor):
MyModel = apps.get_model("my_app", 'MyModel')
MyModel.objects.all().update(new_field=models.F('old_field'))
class Migration(migrations.Migration):
dependencies = [
('orders', '0057_auto_20170410_1513'),
]
operations = [
migrations.RunPython(move_data),
]
就我而言,我犯了一个错误。F()对象无法解析字段旧的\u字段
,但是如果我使用类似的方法
for obj in MyModel.objects.all():
obj.new_field=obj.old_field
obj.save()
而不是
MyModel.objects.all().update(new_field=models.F('old_field'))
一切都会好的
我从一个基本模型继承了几个模型,我需要将一些字段从子模型的上一个移动到父模型。因此,我通过以下步骤实现了这一点
class Base(models.Model):
pass
class MyModel1(Base):
pass
class MyModel2(Base):
field = models.IntegerField()
步骤1和2-重命名字段并在基类中创建
class Base(models.Model):
field = models.IntegerField()
class MyModel1(Base):
pass
class MyModel2(Base):
old_field = models.IntegerField()
步骤3-移动数据
将起作用-
for obj in MyModel2.objects.all():
obj.field=obj.old_field # the same as obj.base_ptr = obj.old_field; obj.base_ptr.save()
obj.save()
不起作用-
MyModel2.objects.all().update(field=models.F('old_field'))
它应该以
F('old_field')
的方式工作。你能把MyModel
的模型定义包括进来吗?嗯,旧的值是另一个模型的值?检查以下内容:“但是,与筛选和排除子句中的F()对象不同,在更新中使用F()对象时,不能引入联接–只能引用正在更新的模型的本地字段。如果尝试使用F()对象引入联接,将引发FieldError”我已添加了模型定义。不,我没有使用其他模型的字段。我刚刚意识到,当我将一个字段从继承的模型移动到基础模型时,它会从数据库中的一个表移动到另一个表,所以数据也应该在表之间移动。我在代码中只使用一个模型,但在数据库级别,它将是两个不同的表。所以在这种情况下,F()不起作用。如果我不对,请纠正我是的,你是对的。我认为在这种情况下不能使用F。也许您可以使用for循环执行一个或多个循环。在第二种情况下,使用一个,您将在这个过程中节省大量内存。我面临着完全相同的问题,您是如何解决的?刚完成了for循环?