Tengo un archivo de migración personalizado que crea una entrada en la tabla de usuarios. El proyecto de trabajo inicial tiene estas migraciones:
1. 001_initial.py # creates model with some fields 2. 002_custom_user_data.py # adds data in "user" due some middle requirement after some time.Ahora quiero agregar una columna más a esta tabla como " config_data ". Para esto, he seguido los siguientes pasos:
1. python manage.py makemigrations <app-name> # creates one more migration file` 003_add_config_data_field.py 2. python manage.py migrate # raise an errorEl comando de migración genera el siguiente error.
Applying my_user.001_initial.py... OK Applying my_user.002_custom_user_data.py ...Traceback (most recent call last): File "/home/myhome/.local/share/virtualenvs/myproject/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute return self.cursor.execute(sql, params) psycopg2.errors.UndefinedColumn: column my_user.config_data does not exist LINE 1: ..., "my_user"."address",Esto se debe a que la migración 002 intenta acceder a la tabla my_user antes de que se migre la migración del campo agregado (003) en la tabla, lo que genera un error de datos de configuración de columna indefinida.
Cualquier idea de cómo se puede resolver esto, ya que estas migraciones deberían funcionar para la base de datos nueva, así como para la producción de dB en la que hasta 002 se migró antes.
A continuación se muestra la migración de 002_custom_user_data.py
# Generated by Django 3.2.2 from django.db import migrations from myapp.models import MyUser def create_user(apps, schema_editor): user = MyUser.objects.get_or_create(id=123) user.address = 'demo' user.save() def delete_user(apps, schema_editor): MyUser.objects.filter(id=123).delete() class Migration(migrations.Migration): dependencies = [ ('my_user', '001_initial'), ] operations = [ migrations.RunPython(create_user, delete_user, elidable=True) ]Gracias.
Debe importar el modelo histórico , no su modelo actual. Django realiza un seguimiento de cómo se ve el modelo antes de ejecutar esa migración, puede acceder a dicho modelo con el apps.get_model(…) [Django-doc] :
from django.db import migrations # No import from myapp.models! def create_user(apps, schema_editor): MyUser = apps.get_model('my_user', 'MyUser') user = MyUser.objects.get_or_create(id=123) user.address = 'demo' user.save() def delete_user(apps, schema_editor): MyUser = apps.get_model('my_user', 'MyUser') MyUser.objects.filter(id=123).delete() class Migration(migrations.Migration): dependencies = [ ('my_user', '001_initial'), ] El modelo MyUser que usamos aquí no tendrá per se todos los campos del que defina en models.py , ni los campos per se tendrán el mismo tipo. Por lo tanto, aquí puede trabajar con el modelo como era en ese momento y, por lo tanto, definir migraciones de datos . Los registros se actualizarán más tarde si creó un campo adicional, por ejemplo.