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.
stack overflow/How to change the name of a Django app? Comme écrit ici.
En 4 étapes, j'ai pu changer le nom de l'application tout en conservant le code et les enregistrements existants.
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
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
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.
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.
De là, changez blogs
en vlogs
.
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.
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,
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
.
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;
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'
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.
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
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.
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.
Recommended Posts