Django 使用F()对象don';t在数据迁移中起作用

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

我正在尝试使用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.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'))
一切都会好的

我从一个基本模型继承了几个模型,我需要将一些字段从子模型的上一个移动到父模型。因此,我通过以下步骤实现了这一点

  • 重命名child中的旧字段
  • 在父字段中创建新字段
  • 将数据从旧字段移动到新字段
  • 删除旧字段
  • 我在第三步面对这个问题,不明白为什么它不起作用

    有人能解释一下吗

    它是否与模型状态渲染过程有关

    UPD. 模型的简化定义

    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循环?