[PYTHON] Renommer une application Django existante

Qu'est-ce que c'est?

Je développe généralement avec Django, et parfois j'y pense.

`Cela fonctionne bien maintenant, mais je n'aime pas le nom de l'application. ''

Si vous modifiez simplement le nom du dossier en tant qu'essai, une table inutile sera créée et les données existantes ne pourront pas être utilisées.

Que faire lorsque vous souhaitez modifier le nom de l'application tout en utilisant les données de la table existante telles quelles

Je pense qu'il existe différentes méthodes, mais je les ai résumées comme l'une d'entre elles.

Conclusion

stack overflow/How to change the name of a Django app? Comme écrit ici.

  1. Renommez le dossier
  2. Modifiez AppConfig, modifiez ʻINSTALLED_APPS` dans les paramètres
  3. Renommez l'ancienne table pour qu'elle corresponde au nouveau nom d'application
  4. Réécrire django_content_type et django_migrations

En 4 étapes, j'ai pu changer le nom de l'application tout en conservant le code et les enregistrements existants.

Pourquoi avez-vous besoin des étapes ci-dessus?

Je décrirai brièvement pourquoi la modification du nom du dossier ne fonctionne pas comme prévu.

Les migrations Django sont gérées dans la table django_migrations. (J'utilise Sequel Pro) ↓django_migrations image.png

La colonne de l'application est ʻINSTALLED_APPS dans settings.py, La colonne de nom contient le nom de fichier dans migrations` pour chaque application.

De plus, Model est géré dans la table django_content_type. ↓django_content_type image.png

La colonne app_label est également ʻINSTALLED_APPS dans settings.py`, La colonne modèle contient le nom du modèle «models.py» dans chaque application.

Même si vous changez le nom du dossier, s'il reste tel quel, Django reconnaîtra qu'une application complètement nouvelle a été créée.

En suivant les étapes 3 et 4 ci-dessus, vous devez faire en sorte que Django reconnaisse l'application renommée comme étant celle d'origine.

Voici le processus de déplacement de ma main. Si vous êtes intéressé, veuillez le lire.


supposition

Supposons que vous souhaitiez renommer votre application blogs en application vlogs.

Créez une application de blogs.

1: Créer un projet Django

$ django-admin startproject my-site

2: Créez une application de blogs

$ python manage.py startapp blogs

3: Créer un PostModel

blogs/models.py

from django.db import models


class Post(models.Model):
    title = models.CharField(max_length=255)

4: Exécutez la migration my-site/settings.py

INSTALLED_APPS = [
    'blogs.apps.BlogsConfig',
    ...
]
$ python manage.py migrate

Cela créera une table comme celle-ci. image.png

De là, changez blogs en vlogs.

1. Renommez le dossier

Je vais vous présenter ce qui se passe si vous changez simplement le nom du dossier à titre d'essai.

/ blogs / vlogs. Dans cet état

$ python manage.py migrate

Alors bien sûr ModuleNotFoundError: No module named 'blogs' Ce sera.

Ensuite.

2. Modifiez AppConfig, modifiez ʻINSTALLED_APPS` dans les paramètres

Vous devez éditer ʻINSTALLED_APPS` car vous vous êtes fâché contre 1.

vlogs/apps.py

from django.apps import AppConfig


class VlogsConfig(AppConfig):
    name = 'vlogs'

settings.py


INSTALLED_APPS = [
    'vlogs.apps.VlogsConfig',
    ...
]

Django devrait maintenant reconnaître l'application vlogs '. Exécutez show migrations`

$ python manage.py showmigrations
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
 [X] 0009_alter_user_last_name_max_length
 [X] 0010_alter_group_name_max_length
 [X] 0011_update_proxy_permissions
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial
vlogs
 [ ] 0001_initial

Vous êtes reconnu. «migrer».

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, vlogs
Running migrations:
  Applying vlogs.0001_initial... OK

Cela fonctionne bien comme ça, image.png Vous vous retrouverez avec vlogs_post et blogs_post. L'idéal est de n'avoir que vlogs_post. Maintenant, changez blogs_post en vlogs_post.

3. Renommez l'ancienne table pour qu'elle corresponde au nouveau nom d'application

Je veux que la table créée à partir de PostModel devienne vlogs_post en renommant blogs app en vlogs app. Modifiez le nom de la table.

mysql> ALTER TABLE blogs_post RENAME TO vlogs_post;

4. Réécrire django_content_type et django_migrations

Afin que les applications qui étaient auparavant traitées comme des blogs soient traitées comme des vlogs à l'avenir Réécrivez django_content_type et django_migrations.

mysql> UPDATE django_content_type SET app_label='vlogs' WHERE app_label='blogs'
mysql> UPDATE django_migrations SET app='vlogs' WHERE app='blogs'

résultat

Voyons maintenant s'il n'y a pas de problème. Comme méthode de confirmation

1: rien ne se passe lorsque vous exécutez la migration sans apporter de modifications au modèle

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, vlogs
Running migrations:
  No migrations to apply.

image.png Cela ne semble pas être un problème.

2: La migration sera créée à partir de la suite lorsque le modèle sera modifié. Ajoutez une colonne de contenu au modèle de publication. vlogs/models.py


from django.db import models


class Post(models.Model):
    title = models.CharField(max_length=255)
    content = models.CharField(max_length=255, null=True)

$ python manage.py makemigrations
Migrations for 'vlogs':
  vlogs/migrations/0002_post_content.py
    - Add field content to post

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, vlogs
Running migrations:
  Applying vlogs.0002_post_content... OK

image.png

De cette façon, 0002_post_content.py a été créé comme une continuation sous vlogs / migrations, et la colonne de contenu a été ajoutée sans aucun problème.

Résumé

Je pensais que c'était un bon sujet pour comprendre en quelque sorte à quoi ressemble la migration de Django et à quoi fonctionne. J'ai aussi abordé django_content_type, auquel je ne fais généralement pas attention.

C'est GitHub pour le moment.

Merci beaucoup.

référence

Recommended Posts

Renommer une application Django existante
Parcourir une base de données externe existante avec Django
[Django] Renommer le projet
Procédure de création d'une application avec Django avec Pycharm ~ Préparation ~
Déployer une application existante avec docker + pyenv-virtualenv + uwsgi + django
C'était trop facile d'utiliser une base de données existante avec Django
Créer une API avec Django
Renommer les colonnes de table dans Django3
Créer une application Web avec Django
Développement d'une application WEB avec Django [Django startup]
Notes de lancement pour les applications Django existantes
Charger les modules Django avec un interpréteur
Développement d'une application WEB avec Django [Ajout d'application]
Mesurer la couverture des applications Django avec Coverage.py
Enregistrer l'application Django dans le projet
Django débutant a essayé de créer l'environnement
Déployer l'application Django avec Docker
Créer une nouvelle application utiliser python, django
Application de publication sur Twitter réalisée avec Django
Créer une application Web avec Django
Remarque: envoyer un e-mail avec Django
Comment créer une application à partir du cloud à l'aide du framework Web Django