Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

203
Vistas
la actualización del conjunto de consultas usando el objeto F () no funciona en las migraciones de datos

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

  1. cambiar el nombre de los campos antiguos en niño
  2. crear los nuevos campos en padre
  3. mover datos de campos antiguos a campos nuevos
  4. eliminar los campos antiguos

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'))
about 4 years ago · Santiago Trujillo
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda