Estoy tratando de crear una migración de datos utilizando el método de conjunto de consultas de actualización. Tengo un proceso de migración complejo para mi caso, por lo que enfrenté el siguiente problema. el ejemplo sencillo
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), ] En mi caso obtuve FieldError. El objeto F () no puede resolver el campo old_field , pero si usaré algo como esto
for obj in MyModel.objects.all(): obj.new_field=obj.old_field obj.save()en vez de
MyModel.objects.all().update(new_field=models.F('old_field'))todo estará bien
Tengo algunos modelos heredados de un modelo base y necesito mover algunos campos del modelo secundario al principal. Así que hice esto con los siguientes pasos
Enfrenté esto en el paso 3 y no puedo entender por qué no funciona
¿Alguien puede dar alguna explicación de esto?
¿Está relacionado con el proceso de representación del estado del modelo de alguna manera?
UPD. La definición simplificada de modelos
class Base(models.Model): pass class MyModel1(Base): pass class MyModel2(Base): field = models.IntegerField()Paso 1 y 2: cambie el nombre del campo y cree en la clase base
class Base(models.Model): field = models.IntegerField() class MyModel1(Base): pass class MyModel2(Base): old_field = models.IntegerField()Paso 3: mover datos
Trabajará -
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()no funcionará -
MyModel2.objects.all().update(field=models.F('old_field'))