Solución:
Siga estos pasos para cambiar el nombre de una aplicación en Django:
- Cambie el nombre de la carpeta que está en la raíz de su proyecto
- Cambie cualquier referencia a su aplicación en sus dependencias, es decir, la aplicación
views.py
,urls.py
, ‘manage.py’ ysettings.py
archivos. - Editar la tabla de la base de datos
django_content_type
con el siguiente comando:UPDATE django_content_type SET app_label="<NewAppName>" WHERE app_label="<OldAppName>"
- Además, si tiene modelos, tendrá que cambiar el nombre de las tablas de modelos. Para uso de postgres
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
. Para mysql también creo que es lo mismo (como lo menciona @null_radix) - (Para Django> = 1.7) Actualice el
django_migrations
table para evitar que se vuelvan a ejecutar sus migraciones anteriores:UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'
. Nota: hay cierto debate (en los comentarios) si este paso es necesario para Django 1.8+; Si alguien lo sabe con seguridad, actualice aquí. - Si tu
models.py
La Meta Class tieneapp_name
en la lista, asegúrese de cambiarle el nombre también (mencionado por @will). - Si has espaciado tu nombre
static
otemplates
carpetas dentro de su aplicación, también deberá cambiarles el nombre. Por ejemplo, renombrarold_app/static/old_app
paranew_app/static/new_app
. - Para cambiar el nombre de django
models
, necesitarás cambiardjango_content_type.name
entrada en DB. Para uso de PostgreSQLUPDATE django_content_type SET name="<newModelName>" where name="<oldModelName>" AND app_label="<OldAppName>"
Meta punto (si usa virtualenv): Vale la pena señalar que si está cambiando el nombre del directorio que contiene su virtualenv, es probable que haya varios archivos en su entorno que contengan una ruta absoluta y también deberán actualizarse. Si recibe errores como ImportError: No module named ...
este podría ser el culpable. (gracias a @danyamachine por proporcionar esto).
Otras referencias: es posible que también desee consultar los enlaces a continuación para obtener una imagen más completa
- Cambiar el nombre de una aplicación con Django y South
- ¿Cómo migro un modelo de una aplicación django a una nueva?
- ¿Cómo cambiar el nombre de una aplicación Django?
- Migración hacia atrás con Django South
- ¿La forma más fácil de cambiar el nombre de un modelo usando Django / South?
- Código Python (gracias a A.Raouf) para automatizar los pasos anteriores (Código no probado. ¡Has sido advertido!)
- Código Python (gracias a rafaponieman) para automatizar los pasos anteriores (Código no probado. ¡Has sido advertido!)
Lo nuevo en Django 1.7 es un registro de aplicaciones que almacena la configuración y proporciona introspección. Esta maquinaria le permite cambiar varios atributos de la aplicación.
El punto principal que quiero señalar es que no siempre es necesario cambiar el nombre de una aplicación: con la configuración de la aplicación es posible resolver aplicaciones en conflicto. Pero también el camino a seguir si su aplicación necesita un nombre amigable.
Como ejemplo, quiero nombrar mi aplicación de encuestas ‘Comentarios de los usuarios’. Dice así:
Crear un apps.py
archivo en el polls
directorio:
from django.apps import AppConfig
class PollsConfig(AppConfig):
name="polls"
verbose_name = "Feedback from users"
Agregue la configuración de la aplicación predeterminada a su polls/__init__.py
:
default_app_config = 'polls.apps.PollsConfig'
Para obtener más configuración de la aplicación: https://docs.djangoproject.com/en/1.7/ref/applications/
¡Problema divertido! Pronto tendré que cambiar el nombre de muchas aplicaciones, así que hice un ensayo.
Este método permite avanzar en pasos atómicos para minimizar las interrupciones para otros desarrolladores que trabajan en la aplicación a la que le estás cambiando el nombre.
Vea el enlace en la parte inferior de esta respuesta para ver el código de ejemplo de trabajo.
-
Prepare el código existente para la mudanza:
- Crear una configuración de aplicación (establecer
name
ylabel
a los valores predeterminados). - Agregue la configuración de la aplicación a
INSTALLED_APPS
. - En todos los modelos, establezca explícitamente
db_table
al valor actual. - Doctor migraciones para que
db_table
fue “siempre” definido explícitamente. - Asegúrese de que no se requieran migraciones (verifique el paso anterior).
- Crear una configuración de aplicación (establecer
-
Cambiar la etiqueta de la aplicación:
- Colocar
label
en la configuración de la aplicación al nuevo nombre de la aplicación. - Actualice las migraciones y las claves externas para hacer referencia a la nueva etiqueta de la aplicación.
- Actualizar plantillas para vistas genéricas basadas en clases (la ruta predeterminada es
<app_label>/<model_name>_<suffix>.html
) -
Ejecute SQL sin procesar para corregir migraciones y
content_types
aplicación (desafortunadamente, algo de SQL sin procesar es inevitable). No puede ejecutar esto en una migración.UPDATE django_migrations SET app = 'catalogue' WHERE app = 'shop'; UPDATE django_content_type SET app_label="catalogue" WHERE app_label="shop";
-
Asegúrese de que no se requieran migraciones (verifique el paso anterior).
- Colocar
-
Cambiar el nombre de las tablas:
- Eliminar “personalizado”
db_table
. - Correr
makemigrations
para que django pueda cambiar el nombre de la tabla “a la predeterminada”.
- Eliminar “personalizado”
-
Mover los archivos:
- Cambiar el nombre del directorio del módulo.
- Corrija las importaciones.
- Actualizar la configuración de la aplicación
name
. - Actualizar donde
INSTALLED_APPS
hace referencia a la configuración de la aplicación.
-
Organizar:
- Elimine la configuración de la aplicación personalizada si ya no es necesaria.
- Si la configuración de la aplicación desapareció, no olvide eliminarla también de
INSTALLED_APPS
.
Solución de ejemplo: He creado app-rename-example, un proyecto de ejemplo en el que puedes ver cómo cambié el nombre de una aplicación, una confirmación a la vez.
El ejemplo usa Python 2.7 y Django 1.8, pero estoy seguro de que el mismo proceso funcionará en al menos Python 3.6 y Django 2.1.