¿Puedo especificar un valor predeterminado personalizado que se utilizará al migrar después de agregar una nueva clase superior en un modelo Django?
Estoy escribiendo una aplicación Django que provee un modelo muy simple llamado Submittable
, el cual los usuarios de la aplicación deben heredar cuando deseen usar otras funcionalidades de la app.
<h1>app1</h1>
class Submittable(models.Model):
is_submitted = models.BooleanField(default=False)
# otros métodos aquí
<h1>app2</h1>
class Paper(Submittable):
# algunos campos
Sin embargo, cuando agrego esto como padre en un modelo ya existente en otra aplicación y corro makemigrations
, me pide proveer un valor por defecto para el nuevo campo submittable_ptr_id
. El problema es que quiero que este campo simplemente apunte a una nueva instancia de Submittable
, pero no sé cómo hacerlo.
Sé que podría simplemente editar el archivo de migración creado como se muestra a continuación:
class Migration(migrations.Migration):
dependencies = [
# algunas dependencias
]
operations = [
migrations.AddField(
model_name='Paper',
name='submittable_ptr_id',
field=models.OneToOneField(auto_created=True, default=app1.utils.create_submittable, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='app1.Submittable'),
preserve_default=False,
),
]
Pero quiero saber si puedo especificar algo en app1
para que esto suceda automáticamente. No quiero que los usuarios de la aplicación tengan que hacer este cambio por ellos mismos y en su lugar, cada vez que alguien hereda de Submittable
y corre makemigrations
, el valor por defecto debería ser simplemente establecido en esta función que crea un nuevo Submittable
.
davy.ai
Desafortunadamente, no hay una forma automática de establecer el valor predeterminado del campo
submittable_ptr_id
en una nueva instancia deSubmittable
cada vez que alguien hereda deSubmittable
. La razón es que cuando heredas de un modelo en Django, crea una nueva tabla en la base de datos con una clave externa que apunta al modelo padre. El camposubmittable_ptr_id
es la clave externa del modeloSubmittable
.Una solución, como mencionaste, es editar el archivo de migración y establecer el valor predeterminado en una función que crea un nuevo
Submittable
. Sin embargo, esto significa que los usuarios de la aplicación tendrán que modificar el archivo de migración ellos mismos.Otra solución es crear un comando de administración personalizado que genere un nuevo archivo de migración con el valor predeterminado establecido en la función que crea un nuevo
Submittable
. De esta manera, los usuarios de la aplicación pueden ejecutar este comando en lugar de editar manualmente el archivo de migración.Para crear un comando de administración personalizado, puedes seguir estos pasos:
management
en la raíz de tu aplicación de Django.management
, crea otro directorio llamadocommands
.commands
, crea un módulo Python llamadocreate_submittable_migration.py
.create_submittable_migration.py
, define un comando de administración personalizado que genere un nuevo archivo de migración con el valor predeterminado establecido en la función que crea un nuevoSubmittable
. Puedes usar la funcióncall_command
del módulodjango.core.management
para ejecutar el comandomakemigrations
con los argumentos adecuados. Aquí tienes un ejemplo:python manage.py create_submittable_migration
. Esto generará un nuevo archivo de migración con el valor predeterminado establecido en la función que crea un nuevoSubmittable
.Nota: Esta solución puede no ser ideal si el modelo
Submittable
tiene muchos campos o si la creación de un nuevoSubmittable
tiene muchas dependencias. En ese caso, puede ser mejor que los usuarios modifiquen el archivo de migración ellos mismos o que se proporcionen instrucciones más detalladas sobre cómo modificar el archivo de migración.