Normalerweise entwickle ich mich mit Django und manchmal denke ich darüber nach.
`Es funktioniert jetzt gut, aber ich mag den Anwendungsnamen nicht. ``
Wenn Sie den Ordnernamen nur als Test ändern, wird eine unnötige Tabelle erstellt und die vorhandenen Daten können nicht verwendet werden.
Was tun, wenn Sie den Anwendungsnamen ändern möchten, während Sie die Daten in der vorhandenen Tabelle unverändert verwenden?
Ich denke, es gibt verschiedene Methoden, aber ich habe sie als eine davon zusammengefasst.
stack overflow/How to change the name of a Django app? Wie hier geschrieben.
INSTALLED_APPS
In 4 Schritten konnte ich den Anwendungsnamen ändern, ohne den vorhandenen Code und Datensatz zu ändern.
Ich werde kurz beschreiben, warum das Ändern des Ordnernamens nicht wie erwartet funktioniert.
Django-Migrationen werden in der Tabelle "django_migrations" verwaltet. (Ich verwende Sequel Pro)
↓django_migrations
Die App-Spalte lautet "INSTALLED_APPS" in "settings.py". Die Namensspalte enthält den Dateinamen in "Migrationen" für jede Anwendung.
Außerdem wird Model in der Tabelle django_content_type
verwaltet.
↓django_content_type
Die Spalte app_label ist auch INSTALLED_APPS
in settings.py
,
Die Modellspalte enthält in jeder Anwendung den Modellnamen "models.py".
Selbst wenn Sie den Ordnernamen ändern, erkennt Django, dass eine vollständig neue Anwendung erstellt wurde, wenn sie unverändert bleiben.
Wenn Sie die obigen Schritte 3 und 4 ausführen, müssen Sie Django veranlassen, die umbenannte Anwendung als die ursprüngliche zu erkennen.
Unten ist der Prozess des Bewegens meiner Hand. Wenn Sie interessiert sind, lesen Sie es bitte.
Angenommen, Sie möchten Ihre "Blogs-App" in "Vlogs-App" umbenennen.
Erstellen Sie eine "Blogs-App".
1: Erstellen Sie ein Django-Projekt
$ django-admin startproject my-site
2: Erstellen Sie eine Blog-App
$ python manage.py startapp blogs
3: PostModel erstellen
blogs/models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=255)
4: Führen Sie die Migration aus
my-site/settings.py
INSTALLED_APPS = [
'blogs.apps.BlogsConfig',
...
]
$ python manage.py migrate
Dadurch wird eine Tabelle wie diese erstellt.
Von hier aus ändern Sie "Blogs" in "Vlogs".
Ich werde vorstellen, was passiert, wenn Sie den Ordnernamen nur als Testversion ändern.
/ Blogs
→ / vlogs
.
In diesem Staat
$ python manage.py migrate
Dann natürlich
ModuleNotFoundError: No module named 'blogs'
Es wird sein.
Dann als nächstes.
INSTALLED_APPS
Sie müssen INSTALLED_APPS
bearbeiten, da Sie sich über 1 geärgert haben.
vlogs/apps.py
from django.apps import AppConfig
class VlogsConfig(AppConfig):
name = 'vlogs'
settings.py
INSTALLED_APPS = [
'vlogs.apps.VlogsConfig',
...
]
Django sollte jetzt die vlogs App
erkennen.
Führen Sie "show migrations" aus
$ 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
Du wirst erkannt. migrieren
.
$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, vlogs
Running migrations:
Applying vlogs.0001_initial... OK
Es funktioniert gut so, Sie werden mit "vlogs_post" und "blog_post" enden. Das Ideal ist, nur "vlogs_post" zu haben. Ändern Sie nun "blog_post" in "vlogs_post".
Ich möchte, dass die aus PostModel erstellte Tabelle zu "vlogs_post" wird, indem "Blogs App" in "Vlogs App" umbenannt wird. Ändern Sie den Tabellennamen.
mysql> ALTER TABLE blogs_post RENAME TO vlogs_post;
Damit Anwendungen, die zuvor als Blogs behandelt wurden, in Zukunft als Vlogs behandelt werden Schreiben Sie "django_content_type" und "django_migrations" neu.
mysql> UPDATE django_content_type SET app_label='vlogs' WHERE app_label='blogs'
mysql> UPDATE django_migrations SET app='vlogs' WHERE app='blogs'
Lassen Sie uns nun prüfen, ob es kein Problem gibt. Als Bestätigungsmethode
1: Wenn Sie die Migration ausführen, ohne Änderungen am Modell vorzunehmen, geschieht nichts
$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, vlogs
Running migrations:
No migrations to apply.
Es scheint kein Problem zu sein.
2: Die Migration wird aus der Fortsetzung erstellt, wenn das Modell geändert wird.
Fügen Sie dem Post-Modell eine Inhaltsspalte hinzu.
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
Auf diese Weise wurde "0002_post_content.py" als Fortsetzung unter "vlogs / migrations" erstellt und die Inhaltsspalte problemlos hinzugefügt.
Ich dachte, es wäre ein gutes Thema, um irgendwie zu verstehen, wie Djangos Migration aussieht und funktioniert.
Ich habe auch django_content_type
angesprochen, worauf ich normalerweise nicht achte.
Es ist vorerst GitHub.
Vielen Dank.
Recommended Posts