Comment changer le nom d'une application Django?

158

J'ai changé le nom d'une application dans Django en renommant son dossier, les importations et toutes ses références (modèles / index). Mais maintenant j'obtiens cette erreur quand j'essaye de courirpython 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?

André
la source
Salut Danihp. Oui j'ai. J'utilise également virtualenv, je ne sais pas si cela a quelque chose à voir avec.
André
1
Si, par hasard, vous utilisez PyCharm, sa renamefonctionnalité vous aidera grandement.
Anto
1
Le Sud ne soutient-il pas une telle opération?
andilabs

Réponses:

287

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

  1. Renommez le dossier qui se trouve à la racine de votre projet
  2. Modifiez toutes les références à votre application dans leurs dépendances, à savoir l'application views.py, urls.py« manage.py » et les settings.pyfichiers.
  3. Modifiez la table de base de données django_content_typeavec 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 de modèles. Pour une utilisation postgres 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) Mettre à jour la django_migrationstable pour éviter d' avoir vos migrations antérieures Réexécutez: UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'. Remarque : il y a un débat (dans les commentaires) si cette étape est requise pour Django 1.8+; Si quelqu'un sait avec certitude, veuillez mettre à jour ici.
  6. Si votre models.pyMeta Class est app_namerépertorié, assurez-vous de le renommer également (mentionné par @will).
  7. Si vous avez placé vos dossiers staticou templatesdans votre application, vous devrez également les renommer. Par exemple, renommez old_app/static/old_appen new_app/static/new_app.
  8. Pour renommer django models, vous devrez changer l' django_content_type.nameentrée dans DB. Pour une utilisation postgreSQLUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'

Meta point (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 devront également être mis à jour. Si vous rencontrez des erreurs comme celle-ci, ImportError: No module named ...cela pourrait être le coupable. (merci à @danyamachine pour cela).

Autres références: vous pouvez également consulter les liens ci-dessous pour une image plus complète

  1. Renommer une application avec Django et South
  2. Comment 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évenu!)
Srikar Appalaraju
la source
3
De plus, si vous avez des modèles, vous devrez renommer les tables de modèles. Pour postgres utiliser ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
null_radix
11
Et si vous utilisez les nouvelles migrations, vous devrez modifier le nom de l'application dans les fichiers de migration existants et dans la table django_migrations. Il serait peut-être préférable d'écraser d'abord les migrations afin qu'il y ait moins à modifier.
James
7
Pour Postgres, si vous souhaitez également renommer la séquence, utilisez ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;. Bien que ce ne soit pas nécessaire, le système lui-même ne se soucie pas du nom. La colonne DEFAULT stocke un OID( 'foo_pkey_seq'::regclass), vous pouvez changer le nom de la séquence sans casser cela - l'OID reste le même.
Konstantine Kalbazov
3
Ce serait formidable si vous mettiez à jour votre réponse pour inclure ce que James a dit sur la mise à niveau des fichiers de migration (tels que les noms de modules de dépendance) ...
u3l
2
Voici une commande de gestion qui permet de renommer le modèle selon la solution de @ SrikarAppalaraju: gist.github.com/rafaponieman/201054ddf725cda1e60be3fe845850a5 Elle accepte ancien_nom, nouveau_nom et classes comme paramètres (tous formatés tels qu'ils apparaissent sur les tables et les champs de la base de données).
rafaponieman
32

Nouveau dans Django 1.7 est un registre d'applications qui stocke la configuration et fournit une introspection. Cette machine vous permet de modifier plusieurs attributs d'application.

Le point principal que je veux souligner est que renommer une application n'est pas toujours nécessaire: avec la configuration de l'application, il est possible de résoudre les applications en conflit. Mais aussi la voie à suivre si votre application a besoin d'un nom convivial.

À titre d'exemple, je veux nommer mon application de sondage «Commentaires des utilisateurs». Ça va comme ça:

Créez un apps.pyfichier dans le pollsrépertoire:

from django.apps import AppConfig

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

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

default_app_config = 'polls.apps.PollsConfig'

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

toutes en majuscules
la source
13

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éez une configuration d'application (définie nameet labelpar défaut).
    • Ajoutez la configuration de l'application à INSTALLED_APPS.
    • Sur tous les modèles, définissez explicitement db_tablela valeur actuelle.
    • Migrations de médecins afin que ce db_tablesoit «toujours» explicitement défini.
    • Assurez-vous qu'aucune migration n'est requise (vérifiez l'étape précédente).
  2. Modifiez le libellé de l'application :

    • Définissez labeldans la configuration de l'application sur le nouveau nom de l'application.
    • Mettez à jour les migrations et les clés étrangères pour référencer une nouvelle étiquette d'application.
    • Mettre à jour les modèles pour les vues génériques basées sur les classes (le chemin par défaut est<app_label>/<model_name>_<suffix>.html )
    • Exécutez du SQL brut pour corriger les migrations et l' content_typesapplication (malheureusement, du SQL brut est inévitable). Vous ne pouvez pas l'exécuter dans 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 requise (vérifiez l'étape précédente).

  3. Renommez les tables :
    • Supprimer "personnalisé" db_table.
    • Exécutez makemigrationspour que django puisse renommer la table "par défaut".
  4. Déplacez les fichiers :
    • Renommez le répertoire du module.
    • Corrigez les importations.
    • Mettez à jour la configuration de l'application name.
    • Mettez à jour où fait INSTALLED_APPSréférence à la configuration de l'application.
  5. Ranger :
    • Supprimez la configuration d'application personnalisée si elle n'est plus nécessaire.
    • Si la configuration de l'application a disparu, n'oubliez pas de la supprimer également INSTALLED_APPS.

Exemple de solution: j'ai créé app-rename-example , un exemple de projet où vous pouvez voir comment j'ai renommé une application, une validation à la fois.

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

maillé
la source
1
Merci @meshy. Cela m'a vraiment aidé à renommer une énorme application. Une suggestion, après avoir exécuté la dernière migration, vous pouvez supprimer tous les fichiers de migration et recréer le fichier de migration initiale 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.
Rohan
J'avais écrit ceci dans l'espoir que les migrations soient exécutables à partir de zéro une fois le processus terminé. Si les migrations ont échoué, l'un de nous a peut-être manqué quelque chose. J'y réfléchirai et je verrai s'il y a d'autres étapes que je dois ajouter.
meshy
@Rohan y a-t-il des informations que vous pourriez fournir pour détailler exactement comment les migrations ont échoué?
meshy
Si vous exécutez le test localement avec les anciens fichiers de migration, vous pouvez voir qu'il ne parviendra pas à créer les tables @meshy
Rohan
1
Ce plan de match a parfaitement fonctionné pour moi. Tant que chaque étape est déployée via toutes les vérifications actives (CI, autres développeurs, production, etc.) avant que l'étape suivante ne soit abordée, cela a parfaitement fonctionné - aucun problème avec les migrations historiques existantes. Suivez les étapes dans l'ordre et propagez les modifications partout avant de passer à l'étape suivante.
user85461
11

Si vous utilisez PyCharm et que le projet cesse de fonctionner après le changement de nom:

  1. Modifiez la configuration Exécuter / Déboguer et modifiez la variable d'environnement DJANGO_SETTINGS_MODULE, car elle inclut le nom de votre projet.
  2. Accédez à Paramètres / Langues et cadres / Django et mettez à jour l'emplacement du fichier de paramètres.
Maziyar Mk
la source
1
C'est l'une de ces situations où trouver et remplacer m'a échoué. Merci de l'avoir signalé.
ruaanvds
0

Re-migrate approche pour une plaque plus propre.

Cela peut être fait sans douleur SI d'autres applications ne contiennent pas de modèles de clé étrangère de l'application à renommer. Vérifiez et assurez-vous que leurs fichiers de migration ne répertorient aucune migration à partir de celui-ci.

  1. Sauvegardez votre base de données. Videz toutes les tables avec a) données + schéma pour d'éventuelles dépendances circulaires, et b) juste des données pour recharger.
  2. Exécutez vos tests.
  3. Vérifiez tout le code dans VCS.
  4. Supprimez les tables de base de données de l'application à renommer.
  5. Supprimez les autorisations: delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
  6. Supprimer les types de contenu: delete from django_content_type where app_label = '<OldAppName>'
  7. Renommez le dossier de l'application.
  8. Modifiez toutes les références à votre application dans leurs dépendances, à savoir l'application views.py, urls.py« manage.py » et les settings.pyfichiers.
  9. Supprimer les migrations: delete from django_migrations where app = '<OldAppName>'
  10. Si votre models.pyMeta Class est app_namerépertorié, assurez-vous de le renommer également (mentionné par @will).
  11. Si vous avez placé vos dossiers staticou templatesdans votre application, vous devrez également les renommer. Par exemple, renommez old_app/static/old_appen new_app/static/new_app.
  12. Si vous avez défini la configuration de l'application dans apps.py; renommez-les et renommez leurs références dans les paramètres.INSTALLED_APPS
  13. Supprimer les fichiers de migration.
  14. Refaites les migrations et migrez.
  15. Chargez vos données de table à partir de sauvegardes.
mehmet
la source
0

Si vous utilisez Pycharm , renommer une application est très simple avec la refactorisation ( Shift+ F6par défaut) pour tous les fichiers de projet.
Mais assurez-vous de supprimer les __pycache__dossiers dans le répertoire du projet et ses sous-répertoires. Faites également attention car il renomme également les commentaires que vous pouvez exclure dans la fenêtre d'aperçu du refactor qu'il vous montrera.
Et vous devrez renommer OldNameConfig (AppConfig): dansapps.py de votre application renommée.

Si vous ne voulez pas perdre les données de votre base de données, vous devrez le faire manuellement avec une requête dans la base de données comme la réponse susmentionnée.

Subangkar KrS
la source
-3

Pourquoi ne pas simplement utiliser l'option Rechercher et remplacer. (chaque éditeur de code l'a)?

Par exemple Visual Studio Code (sous l'option Modifier):

Option Visual Studio Code: 'Remplacer dans les fichiers'

Il vous suffit de taper l'ancien nom et le nouveau nom et de remplacer tout ce qui se trouve dans le projet en un seul clic.

REMARQUE : cela renomme uniquement le contenu du fichier, PAS les noms de fichiers et de dossiers. N'oubliez pas de renommer les dossiers, par exemple. templates/my_app_name/le renommer entemplates/my_app_new_name/

elano7
la source