[PYTHON] Benennen Sie eine vorhandene Django-Anwendung um

Was ist das?

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.

Fazit

stack overflow/How to change the name of a Django app? Wie hier geschrieben.

  1. Benennen Sie den Ordner um
  2. Ändern Sie AppConfig, ändern Sie in den Einstellungen INSTALLED_APPS
  3. Benennen Sie die alte Tabelle um, um sie an den neuen Anwendungsnamen anzupassen
  4. Schreiben Sie django_content_type und django_migrations neu

In 4 Schritten konnte ich den Anwendungsnamen ändern, ohne den vorhandenen Code und Datensatz zu ändern.

Warum brauchen Sie die oben genannten Schritte?

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 image.png

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 image.png

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.


Annahme

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. image.png

Von hier aus ändern Sie "Blogs" in "Vlogs".

1. Benennen Sie den Ordner um

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.

2. Ändern Sie AppConfig, ändern Sie in den Einstellungen 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, image.png 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".

3. Benennen Sie die alte Tabelle um, um sie an den neuen Anwendungsnamen anzupassen

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;

4. Schreiben Sie django_content_type und django_migrations neu

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'

Ergebnis

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.

image.png 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

image.png

Auf diese Weise wurde "0002_post_content.py" als Fortsetzung unter "vlogs / migrations" erstellt und die Inhaltsspalte problemlos hinzugefügt.

Zusammenfassung

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.

Referenz

Recommended Posts

Benennen Sie eine vorhandene Django-Anwendung um
Durchsuchen Sie eine vorhandene externe Datenbank mit Django
[Django] Benennen Sie das Projekt um
Verfahren zum Erstellen einer Anwendung mit Django mit Pycharm ~ Vorbereitung ~
Stellen Sie eine vorhandene App mit Docker + Pyenv-Virtualenv + Uwsgi + Django bereit
Es war zu einfach, eine vorhandene Datenbank mit Django zu verwenden
Erstellen Sie eine API mit Django
Benennen Sie Tabellenspalten in Django3 um
Erstellen Sie eine Webanwendung mit Django
Entwicklung einer WEB-Anwendung mit Django [Django-Start]
Starten Sie Notizen für vorhandene Django-Anwendungen
Laden Sie ein Django-Modul mit einem Interpreter
Entwicklung einer WEB-Anwendung mit Django [Anwendungszusatz]
Messen Sie die Abdeckung der Django-Anwendung mit Coverage.py
Registrieren Sie die Django-Anwendung im Projekt
Django-Anfänger versuchten, die Umgebung aufzubauen
Stellen Sie die Django-Anwendung mit Docker bereit
Erstellen Sie eine neue Anwendung mit Python, Django
Twitter-Posting-Anwendung mit Django gemacht
Erstellen Sie eine Webanwendung mit Django
Hinweis: Senden Sie eine E-Mail mit Django
So erstellen Sie eine Anwendung aus der Cloud mithilfe des Django-Webframeworks