¿Cómo cambiar el nombre de una aplicación Django?


156

Cambié el nombre de una aplicación en Django al renombrar su carpeta, importaciones y todas sus referencias (plantillas / índices). Pero ahora recibo este error cuando intento ejecutarpython manage.py runserver

Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings

¿Cómo puedo depurar y resolver este error? ¿Alguna pista?


Hola danihp Sí tengo. También estoy usando virtualenv, no sé si eso tiene algo que ver.
André

1
Si, por casualidad, está utilizando PyCharm, su renamefunción lo ayudará mucho con esto.
Anto

1
¿No está South apoyando tal operación?
andilabs

Respuestas:


285

Siga estos pasos para cambiar el nombre de una aplicación en Django:

  1. Cambie el nombre de la carpeta que está en la raíz de su proyecto
  2. Cambiar cualquier referencia a su aplicación en sus dependencias, es decir, de la aplicación views.py, urls.py'manage.py', y settings.pyarchivos.
  3. Edite la tabla de la base de datos django_content_typecon el siguiente comando:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
  4. Además, si tiene modelos, deberá 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)
  5. (Para Django> = 1.7) Actualizar la django_migrationstabla para evitar que sus migraciones anteriores volver a ejecutar: UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'. Nota : hay algún debate (en los comentarios) si este paso es necesario para Django 1.8+; Si alguien lo sabe con seguridad, actualice aquí.
  6. Si su models.pyMeta Class ha app_nameaparecido, asegúrese de cambiarle el nombre también (mencionado por @will).
  7. Si ha namespaced sus statico templatescarpetas dentro de su aplicación, también tendrá que cambiar el nombre de las personas. Por ejemplo, cambie el nombre old_app/static/old_appa new_app/static/new_app.
  8. Para cambiar el nombre de django models, deberá cambiar la django_content_type.nameentrada en DB. Para uso postgreSQLUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'

Metapunto (si usa virtualenv): Vale la pena señalar, si está cambiando el nombre del directorio que contiene su virtualenv, es probable que haya varios archivos en su env 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: también puede consultar los enlaces a continuación para obtener una imagen más completa

  1. Renombrar una aplicación con Django y South
  2. ¿Cómo migro un modelo de una aplicación de django a una nueva?
  3. ¿Cómo cambiar el nombre de una aplicación Django?
  4. Migración hacia atrás con Django South
  5. ¿La forma más fácil de cambiar el nombre de un modelo con Django / South?
  6. Código de Python (gracias a A.Raouf ) para automatizar los pasos anteriores (Código no probado. ¡Has sido advertido!)
  7. Código de Python (gracias a rafaponieman ) para automatizar los pasos anteriores (código no probado. ¡Te lo advertimos!)

3
Además, si tiene modelos, deberá cambiar el nombre de las tablas de modelos. Para uso de postgres ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
null_radix

11
Y si está utilizando las nuevas migraciones, deberá cambiar el nombre de la aplicación en los archivos de migraciones existentes y en la tabla django_migrations. Puede ser mejor aplastar las migraciones primero para que haya menos para editar.
James

77
Para Postgres, si también desea cambiar el nombre de la secuencia, use ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;. Aunque no es necesario, al sistema en sí no le importa el nombre. La columna DEFAULT almacena un OID( 'foo_pkey_seq'::regclass), puede cambiar el nombre de la secuencia sin romper eso: el OID permanece igual.
Konstantine Kalbazov

3
Sería genial si actualizara su respuesta para incluir lo que James dijo sobre la actualización de los archivos de migración (como los nombres de los módulos de dependencia) ... no podría resolverlo por un tiempo.
u3l

2
Aquí hay un comando de administración que permite cambiar el nombre del modelo de acuerdo con la solución de @ SrikarAppalaraju: gist.github.com/rafaponieman/201054ddf725cda1e60be3fe845850a5 Acepta old_name, new_name y clases como parámetros (todos formateados según se ven en las tablas y campos de la base de datos).
rafaponieman

32

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 destacar es que cambiar el nombre de una aplicación no siempre es necesario: con la configuración de la aplicación es posible resolver aplicaciones conflictivas. Pero también el camino a seguir si su aplicación necesita nombres amigables.

Como ejemplo, quiero nombrar mi aplicación de encuestas 'Comentarios de los usuarios'. Dice así:

Cree un apps.pyarchivo en el pollsdirectorio:

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/


13

Problema divertido! Tendré que cambiar el nombre de muchas aplicaciones pronto, así que hice una prueba en seco.

Este método permite avanzar en pasos atómicos, para minimizar la interrupción para otros desarrolladores que trabajan en la aplicación que está renombrando.

Vea el enlace al final de esta respuesta para ver el código de ejemplo de trabajo.

  1. Prepare el código existente para la mudanza :
    • Cree una configuración de la aplicación (establecida namey labelpredeterminada).
    • Agregue la configuración de la aplicación a INSTALLED_APPS.
    • En todos los modelos, establezca explícitamente db_tableel valor actual.
    • Cuide las migraciones de modo que db_table"siempre" se definió explícitamente.
    • Asegúrese de que no se requieran migraciones (verifica el paso anterior).
  2. Cambiar la etiqueta de la aplicación :

    • Establecer labelen la configuración de la aplicación con el 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 formato para corregir las migraciones y la content_typesaplicación (desafortunadamente, algunos SQL sin formato son inevitables). 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 (verifica el paso anterior).

  3. Renombrar las tablas :
    • Eliminar "personalizado" db_table.
    • Ejecutar makemigrationspara que django pueda cambiar el nombre de la tabla "por defecto".
  4. Mueve los archivos :
    • Cambiar el nombre del directorio del módulo.
    • Arreglar importaciones.
    • Actualizar la configuración de la aplicación name.
    • Actualización donde hace INSTALLED_APPSreferencia a la configuración de la aplicación.
  5. Ordena :
    • Elimine la configuración de la aplicación personalizada si ya no es necesaria.
    • Si la configuración de la aplicación desapareció, no olvides eliminarla también INSTALLED_APPS.

Solución de ejemplo: he creado app-rename-example , un proyecto de ejemplo donde 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á al menos en Python 3.6 y Django 2.1.


1
Gracias @meshy Realmente me ayudó a cambiar el nombre de una gran aplicación. Una sugerencia, después de ejecutar la última migración, podría eliminar todos los archivos de migración y volver a crear el archivo de migración inicial, lo que le ayudaría si está realizando alguna prueba de integración continua; de lo contrario, el CI no podrá crear la base de datos de prueba.
Rohan

Había escrito esto con la expectativa de que las migraciones fueran ejecutables desde cero una vez que el proceso hubiera terminado. Si las migraciones fallaron, quizás uno de nosotros perdió algo. Lo pensaré y veré si hay otros pasos que necesito agregar.
meshy

@Rohan, ¿hay alguna información que pueda proporcionar para detallar exactamente cómo fallaron las migraciones?
meshy

Si ejecuta la prueba localmente con los archivos de migración antiguos, puede ver que no podrá crear las tablas @meshy
Rohan

1
Este plan de juego funcionó perfectamente para mí. Siempre que cada paso se implemente a través de todos los pagos activos (CI, otros desarrolladores, producción, etc.) antes de abordar el siguiente paso, funcionó perfectamente, sin problemas con las migraciones históricas existentes. Realice los pasos en orden y propague los cambios en todas partes antes de pasar al siguiente paso.
user85461

11

En caso de que esté usando PyCharm y el proyecto deje de funcionar después de cambiar el nombre:

  1. Edite la configuración Ejecutar / Depurar y cambie la variable de entorno DJANGO_SETTINGS_MODULE, ya que incluye el nombre de su proyecto.
  2. Vaya a Configuración / Idiomas y marcos / Django y actualice la ubicación del archivo de configuración.

1
Esta es una de esas situaciones donde encontrar y reemplazar me falló. Gracias por señalar esto.
ruaanvds

0

Enfoque de re-migración para una placa más limpia.

Esto se puede hacer sin problemas SI otras aplicaciones no modifican los modelos de clave externa de la aplicación para cambiarle el nombre. Verifique y asegúrese de que sus archivos de migración no incluyan ninguna migración de este.

  1. Copia de seguridad de su base de datos. Volcar todas las tablas con a) datos + esquema para posibles dependencias circulares, yb) solo datos para recargar.
  2. Ejecute sus pruebas.
  3. Verifique todo el código en VCS.
  4. Elimine las tablas de la base de datos de la aplicación para cambiarle el nombre.
  5. Eliminar los permisos: delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
  6. Eliminar tipos de contenido: delete from django_content_type where app_label = '<OldAppName>'
  7. Cambie el nombre de la carpeta de la aplicación.
  8. Cambiar cualquier referencia a su aplicación en sus dependencias, es decir, de la aplicación views.py, urls.py'manage.py', y settings.pyarchivos.
  9. Eliminar migraciones: delete from django_migrations where app = '<OldAppName>'
  10. Si su models.pyMeta Class ha app_nameaparecido, asegúrese de cambiarle el nombre también (mencionado por @will).
  11. Si ha namespaced sus statico templatescarpetas dentro de su aplicación, también tendrá que cambiar el nombre de las personas. Por ejemplo, cambie el nombre old_app/static/old_appa new_app/static/new_app.
  12. Si definió la configuración de la aplicación en apps.py; cambiar el nombre de esos y cambiar el nombre de sus referencias en la configuración.
  13. Eliminar archivos de migración.
  14. Vuelva a hacer migraciones y migre.
  15. Cargue los datos de su tabla de las copias de seguridad.

0

Si usa Pycharm , cambiar el nombre de una aplicación es muy fácil con la refactorización ( Shift+ F6predeterminado) para todos los archivos de proyecto.
Pero asegúrese de eliminar las __pycache__carpetas en el directorio del proyecto y sus subdirectorios. También tenga cuidado, ya que también cambia el nombre de los comentarios que puede excluir en la ventana de vista previa del refactor que le mostrará.
Y deberá cambiar el nombre de OldNameConfig (AppConfig): además apps.pyde su aplicación renombrada.

Si no desea perder datos de su base de datos, deberá hacerlo manualmente con una consulta en la base de datos como la respuesta mencionada anteriormente.


-3

¿Por qué no usar la opción Buscar y reemplazar? (cada editor de código lo tiene)?

Por ejemplo, Visual Studio Code (en la opción Editar):

Opción de Visual Studio Code: 'Reemplazar en archivos'

Simplemente escriba el nombre antiguo y el nuevo nombre y reemplace todo en el proyecto con un solo clic.

NOTA : Esto renombra solo el contenido del archivo, NO los nombres de archivos y carpetas. No olvide cambiar el nombre de las carpetas, por ejemplo. templates/my_app_name/renombrarlo atemplates/my_app_new_name/

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.