220 votes

Comment changer le nom d'une application Django ?

J'ai changé le nom d'une application dans Django en renommant son dossier, ses importations et toutes ses références (templates/index). Mais maintenant j'obtiens cette erreur quand j'essaie d'exécuter python manage.py runserver

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

Comment puis-je déboguer et résoudre cette erreur ? Des indices ?

0 votes

Salut danihp. Oui, je l'ai fait. J'utilise également virtualenv, je ne sais pas si cela a quelque chose à voir.

1 votes

Si, par hasard, vous utilisez PyCharm, son rename vous sera d'une grande aide.

1 votes

Le Sud ne soutient-il pas une telle opération ?

388voto

Srikar Appal Points 26892

Suivez ces étapes pour changer le nom d'une application dans Django :

  1. Renommer le dossier qui se trouve dans votre projet Racine
  2. Modifiez toutes les références à votre application dans ses dépendances, c'est-à-dire dans le fichier views.py , urls.py , manage.py et settings.py des fichiers.
  3. Modifier la table de la base de données django_content_type avec la commande suivante : UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
  4. De plus, si vous avez des modèles, vous devrez renommer les tables des modèles. Pour postgres, utilisez ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName . Pour mysql aussi, je pense que c'est la même chose (comme mentionné par @null_radix).
  5. (Pour Django >= 1.7) Mettez à jour le fichier django_migrations afin d'éviter que vos migrations précédentes ne soient réexécutées : UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>' . Note Il y a un débat (dans les commentaires) pour savoir si cette étape est nécessaire pour Django 1.8+. Si quelqu'un en est sûr, merci de mettre à jour ici.
  6. Si votre models.py La classe Meta de l'entreprise a app_name listé, assurez-vous de renommer cela aussi (mentionné par @will).
  7. Si vous avez donné un nom à votre static o templates dans votre application, vous devrez également les renommer. Par exemple, renommez old_app/static/old_app a new_app/static/new_app .
  8. Pour renommer django models vous devrez changer django_content_type.name entrée dans DB. Pour postgreSQL, utilisez UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
  9. Mise à jour 16Jul2021 : De plus, le __pycache__/ à l'intérieur de l'application doit être supprimé, sinon vous obtenez EOFError: marshal data too short when trying to run the server . Mentionné par @Serhii Kushchenko

Point méta (si vous utilisez virtualenv) : Il convient de noter que si vous renommez le répertoire qui contient votre virtualenv, il y aura probablement plusieurs fichiers dans votre env qui contiennent un chemin absolu et qui devront également être mis à jour. Si vous obtenez des erreurs telles que ImportError: No module named ... ça pourrait être le coupable. (merci à @danyamachine pour avoir fourni ceci).

Autres références : vous pouvez également vous référer aux liens ci-dessous pour avoir une vision plus complète :

  1. Renommer une application avec Django et South
  2. Comment faire migrer un modèle d'une application Django vers une nouvelle ?
  3. Comment changer le nom d'une application Django ?
  4. Migration vers l'arrière avec Django South
  5. Le moyen le plus simple de renommer un modèle en utilisant Django/South ?
  6. Code Python (merci à A.Raouf ) pour automatiser les étapes ci-dessus (code non testé. Vous avez été prévenu !)
  7. Code Python (merci à rafaponieman ) pour automatiser les étapes ci-dessus (code non testé. Vous avez été prévenus !)

0 votes

Bonjour, cette erreur a été causée par le fait que le nom de l'application est le même que celui du projet... Merci pour votre aide.

3 votes

De même, si vous avez des modèles, vous devrez renommer les tables des modèles. Pour postgres, utilisez ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName

0 votes

Comment changer le nom de tableName_id_seq ?

41voto

allcaps Points 2544

La nouveauté de Django 1.7 est un registre d'applications qui stocke la configuration et permet l'introspection. Cette machine vous permet de modifier plusieurs attributs de l'application.

Ce que je veux dire, c'est qu'il n'est pas toujours nécessaire de renommer une application : Avec la configuration des applications, il est possible de résoudre les conflits d'applications. Mais c'est aussi la voie à suivre si votre application a besoin d'un nom convivial.

Par exemple, je veux nommer mon application de sondage "Feedback from users". C'est comme ça :

Créer un apps.py dans le fichier polls répertoire :

from django.apps import AppConfig

class PollsConfig(AppConfig):
    name = 'polls'
    verbose_name = "Feedback from users"

Ajoutez la configuration de l'application par défaut à votre polls/__init__.py :

default_app_config = 'polls.apps.PollsConfig'

Pour plus de configuration d'applications : https://docs.djangoproject.com/en/1.7/ref/applications/

19voto

meshy Points 2056

Un problème amusant ! Je vais bientôt devoir renommer beaucoup d'applications, alors j'ai fait un essai.

Cette méthode permet de progresser par étapes atomiques, afin de minimiser les perturbations pour les autres développeurs travaillant sur l'application que vous renommez.

Voir le lien au bas de cette réponse pour un exemple de code fonctionnel.

  1. Préparer le code existant pour le déménagement :

    • Créer un configuration de l'application (set name y label aux valeurs par défaut).
    • Ajoutez la configuration de l'application à INSTALLED_APPS .
    • Sur tous les modèles, définissez explicitement db_table à la valeur actuelle.
    • Les migrations de médecins afin que db_table était "toujours" explicitement définie.
    • Assurez-vous qu'aucune migration n'est nécessaire (vérifiez l'étape précédente).
  2. Modifier l'étiquette de l'application :

    • Définir label dans la configuration de l'application pour le nouveau nom de l'application.

    • Mettre à jour les migrations et les clés étrangères pour référencer le nouveau label d'application.

    • Mise à jour des modèles pour les vues génériques basées sur des classes (la Le chemin par défaut est <app_label>/<model_name>_<suffix>.html )

    • Exécuter du SQL brut pour réparer les migrations et content_types (malheureusement, un peu de SQL brut est inévitable). Vous ne pouvez pas l'exécuter dans le cadre d'une migration.

      UPDATE django_migrations
         SET app = 'catalogue'
       WHERE app = 'shop';
      
      UPDATE django_content_type
         SET app_label = 'catalogue'
       WHERE app_label = 'shop';
    • Assurez-vous qu'aucune migration n'est nécessaire (vérifiez l'étape précédente).

  3. Renommer les tables :

    • Supprimer "personnalisé". db_table .
    • Exécuter makemigrations afin que django puisse renommer la table "à la valeur par défaut".
  4. Déplacez les fichiers :

    • Renommer le répertoire des modules.
    • Corriger les importations.
    • Mise à jour de la configuration de l'application name .
    • Mise à jour où INSTALLED_APPS fait référence à la configuration de l'application.
  5. Rangement :

    • Supprimez la configuration des applications personnalisées si elle n'est plus nécessaire.
    • Si la configuration de l'application a disparu, n'oubliez pas de la supprimer aussi de INSTALLED_APPS .

Exemple de solution : J'ai créé app-rename-exemple Vous trouverez ici un exemple de projet où vous pourrez voir comment j'ai renommé une application, un commit à la fois.

L'exemple utilise Python 2.7 et Django 1.8, mais je suis sûr que le même processus fonctionnera au moins sur Python 3.6 et Django 2.1.

1 votes

Merci @meshy. Cela m'a vraiment aidé à renommer une énorme application. Une suggestion, après avoir exécuté la dernière migration, vous pourriez supprimer tous les fichiers de migration et recréer le fichier de migration initial, ce qui vous aiderait si vous effectuez des tests d'intégration continue, sinon le CI échouera à créer la base de données de test.

0 votes

J'avais écrit ceci dans l'espoir que les migrations puissent être exécutées à partir de zéro une fois le processus terminé. Si les migrations ont échoué, peut-être que l'un d'entre nous a manqué quelque chose. Je vais y réfléchir et voir s'il y a d'autres étapes que je dois ajouter.

0 votes

@Rohan, pouvez-vous fournir des informations détaillant la façon dont les migrations ont échoué ?

12voto

Maziyar Mk Points 780

Dans le cas où vous utilisez PyCharm et que le projet cesse de fonctionner après le renommage :

  1. Editez la configuration Run/Debug et changez la variable d'environnement DJANGO_SETTINGS_MODULE, car elle inclut le nom de votre projet.
  2. Allez dans Paramètres / Langues et cadres / Django et mettez à jour l'emplacement du fichier de paramètres.

1 votes

C'est l'une de ces situations où trouver et remplacer m'a fait défaut. Merci de me l'avoir signalé.

10voto

Dennis Points 600

Dans de nombreux cas, je crois que @allcaps's réponse fonctionne bien.

Cependant, il est parfois nécessaire de renommer réellement une application, par exemple pour améliorer la lisibilité du code ou éviter toute confusion.

La plupart des autres réponses impliquent soit manipulation manuelle de bases de données o bricoler des migrations existantes ce que je n'aime pas beaucoup.

Comme alternative, j'aime créer une nouvelle application avec le nom désiré, copier le tout, m'assurer que cela fonctionne, puis supprimer l'application originale :

  1. Commencez un nouveau avec le nom désiré, et copiez tout le code de l'application originale dans celle-ci. Assurez-vous que vous corrigez l'espacement des noms, dans le code nouvellement copié, pour correspondre au nom de la nouvelle application.

  2. makemigrations y migrate . Remarque : si l'application comporte beaucoup de clés étrangères, il y aura probablement des problèmes de conflits d'accesseurs inversés lors de la migration initiale de l'application copiée. Vous devez renommer l'accesseur related_name (ou en ajouter de nouveaux) sur l'ancienne application pour résoudre les conflits.

  3. Créer un migration des données qui copie les données pertinentes des tableaux de l'application originale dans les tableaux de la nouvelle application, et migrate encore.

À ce stade, tout fonctionne encore, car l'application originale et ses données sont toujours en place.

  1. Maintenant vous pouvez remanier tout le code dépendant, afin qu'il n'utilise que la nouvelle application. Voir les autres réponses pour des exemples de ce à quoi il faut faire attention.

  2. Une fois que vous êtes certain que tout fonctionne, vous pouvez supprimer l'application originale. Cela implique une autre migration (de schéma).

Cela présente l'avantage que chaque étape utilise le mécanisme normal de migration de Django, sans manipulation manuelle de la base de données, et que nous pouvons tout suivre dans le contrôle de la source. En outre, nous conservons l'application originale et ses données jusqu'à ce que nous soyons sûrs que tout fonctionne.

0 votes

Je suppose que cela poserait des problèmes si vous vouliez exécuter les migrations sur une nouvelle installation après avoir supprimé l'application originale, non ? Parce que les migrations de données pointeraient vers une application inexistante.

0 votes

@OzgurAkcali : Je pense qu'une installation fraîche ne devrait pas être un problème, car les migrations de données spécifient les dépendances, comme toute autre migration, et elles (devraient) utiliser des modèles historiques. La migration de données ne fera rien, car il n'y a pas de données à migrer. Cependant, dans le cas d'une complètement frais Pour ce qui est de l'installation, je commencerais par faire table rase, donc soit supprimer toutes les migrations et en créer de nouvelles, soit les écraser toutes.

0 votes

Hmm, oui, ils devraient utiliser des modèles historiques. Je me demandais si une ligne comme celle-ci poserait un problème : apps.get_model('old_app', 'ModelName') lorsque l'ancienne application a été supprimée. Si cela ne pose pas de problème, alors je pense que l'étape 3 après l'étape 5 en poserait également.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X