Wie ändere ich den Namen einer Django-App?

156

Ich habe den Namen einer App in Django geändert, indem ich ihren Ordner, Importe und alle ihre Referenzen (Vorlagen / Indizes) umbenannt habe. Aber jetzt bekomme ich diesen Fehler, wenn ich versuche zu laufenpython manage.py runserver

Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings

Wie kann ich diesen Fehler debuggen und beheben? Irgendwelche Hinweise?

André
quelle
Hallo danihp. Ja, habe ich. Ich benutze auch virtualenv, ich weiß nicht, ob das etwas damit zu tun hat.
André
1
Wenn Sie PyCharm zufällig verwenden, renamehilft Ihnen die Funktion dabei sehr.
Anto
1
Unterstützt South eine solche Operation nicht?
Andilabs

Antworten:

285

Führen Sie die folgenden Schritte aus, um den Namen einer App in Django zu ändern:

  1. Benennen Sie den Ordner in Ihrem Projektstamm um
  2. Ändern Sie alle Verweise auf Ihre App auf ihrer Abhängigkeiten, dh die App views.py, urls.py‚manage.py‘ und settings.pyDateien.
  3. Bearbeiten Sie die Datenbanktabelle django_content_typemit dem folgenden Befehl:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
  4. Auch wenn Sie Modelle haben, müssen Sie die Modelltabellen umbenennen. Für Postgres verwenden ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName. Auch für MySQL denke ich, dass es dasselbe ist (wie von @null_radix erwähnt)
  5. (Für Django> = 1.7) Aktualisieren Sie die django_migrationsTabelle, um zu vermeiden, dass Ihre vorherigen Migrationen erneut ausgeführt werden : UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'. Hinweis : Es gibt einige Debatten (in Kommentaren), ob dieser Schritt für Django 1.8+ erforderlich ist. Wenn jemand sicher weiß, bitte hier aktualisieren.
  6. Wenn die models.pyMeta-Klasse Ihres app_nameBenutzers aufgeführt ist, benennen Sie diese ebenfalls um (von @will erwähnt).
  7. Wenn Sie Ihre staticoder templatesOrdner in Ihrer App mit einem Namespace versehen haben , müssen Sie diese auch umbenennen. Benennen Sie beispielsweise old_app/static/old_appan new_app/static/new_app.
  8. Um django umzubenennen models, müssen Sie den django_content_type.nameEintrag in der Datenbank ändern . Für postgreSQL verwendenUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'

Metapunkt (bei Verwendung von virtualenv): Wenn Sie das Verzeichnis umbenennen, in dem sich virtualenv befindet, befinden sich wahrscheinlich mehrere Dateien in Ihrer Umgebung, die einen absoluten Pfad enthalten und ebenfalls aktualisiert werden müssen. Wenn Sie Fehler wie ImportError: No module named ...diese erhalten, könnte dies der Schuldige sein. (Danke an @danyamachine für die Bereitstellung).

Andere Referenzen: Möglicherweise möchten Sie auch auf die folgenden Links verweisen, um ein vollständigeres Bild zu erhalten

  1. Umbenennen einer App mit Django und South
  2. Wie migriere ich ein Modell aus einer Django-App in eine neue?
  3. Wie ändere ich den Namen einer Django-App?
  4. Rückwärtswanderung mit Django South
  5. Der einfachste Weg, ein Modell mit Django / South umzubenennen?
  6. Python-Code (danke an A.Raouf ) zur Automatisierung der obigen Schritte (ungetesteter Code. Sie wurden gewarnt!)
  7. Python-Code (dank rafaponieman ) zur Automatisierung der oben genannten Schritte (ungetesteter Code. Sie wurden gewarnt!)
Srikar Appalaraju
quelle
3
Auch wenn Sie Modelle haben, müssen Sie die Modelltabellen umbenennen. Für Postgres verwenden Sie ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
null_radix
11
Wenn Sie die neuen Migrationen verwenden, müssen Sie den App-Namen in den vorhandenen Migrationsdateien und in der Tabelle django_migrations ändern. Es ist möglicherweise besser, zuerst Migrationen zu quetschen, damit weniger bearbeitet werden muss.
James
7
Wenn Sie für Postgres die Sequenz auch umbenennen möchten, verwenden Sie ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;. Obwohl dies nicht erforderlich ist, kümmert sich das System selbst nicht um den Namen. In der Spalte DEFAULT wird ein OID( 'foo_pkey_seq'::regclass) gespeichert. Sie können den Namen der Sequenz ändern, ohne dies zu unterbrechen - die OID bleibt gleich.
Konstantine Kalbazov
3
Wäre toll, wenn Sie Ihre Antwort aktualisiert , um was James sagte zum Upgrade Migration von Dateien (wie Abhängigkeit Modulnamen) ... konnte sich nicht , dass aus für eine ganze Menge .
u3l
2
Hier ist ein Verwaltungsbefehl, der das Umbenennen von Modellen gemäß der Lösung von @ SrikarAppalaraju ermöglicht: gist.github.com/rafaponieman/201054ddf725cda1e60be3fe845850a5 Er akzeptiert alten Namen, neuen Namen und Klassen als Parameter (alle so formatiert, wie sie in den Datenbanktabellen und -feldern angezeigt werden).
Rafaponieman
32

Neu in Django 1.7 ist eine App-Registrierung, die die Konfiguration speichert und Introspektion bietet. Mit dieser Maschine können Sie mehrere App-Attribute ändern.

Der wichtigste Punkt, den ich ansprechen möchte, ist, dass das Umbenennen einer App nicht immer erforderlich ist: Mit der App-Konfiguration ist es möglich, widersprüchliche Apps zu lösen. Aber auch der richtige Weg, wenn Ihre App eine freundliche Benennung benötigt.

Als Beispiel möchte ich meine Umfrage-App "Feedback von Benutzern" nennen. Es geht so:

Erstellen Sie eine apps.pyDatei im pollsVerzeichnis:

from django.apps import AppConfig

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

Fügen Sie die Standard-App-Konfiguration zu polls/__init__.py:

default_app_config = 'polls.apps.PollsConfig'

Weitere App-Konfiguration: https://docs.djangoproject.com/de/1.7/ref/applications/

Allcaps
quelle
13

Lustiges Problem! Ich werde bald viele Apps umbenennen müssen, also habe ich einen Probelauf gemacht.

Mit dieser Methode können Fortschritte in atomaren Schritten erzielt werden, um Störungen für andere Entwickler zu minimieren, die an der App arbeiten, die Sie umbenennen.

Unter dem Link unten in dieser Antwort finden Sie einen funktionierenden Beispielcode.

  1. Bereiten Sie den vorhandenen Code für den Umzug vor :
    • Erstellen Sie eine App-Konfiguration (festlegen nameund labelauf Standardeinstellungen setzen).
    • Fügen Sie die App-Konfiguration hinzu INSTALLED_APPS.
    • Stellen Sie bei allen Modellen explizit db_tableden aktuellen Wert ein.
    • Doktormigrationen, so dass db_table"immer" explizit definiert wurde.
    • Stellen Sie sicher, dass keine Migrationen erforderlich sind (überprüft den vorherigen Schritt).
  2. Ändern Sie die App-Bezeichnung :

    • In der labelApp-Konfiguration auf neuen App-Namen setzen.
    • Aktualisieren Sie Migrationen und Fremdschlüssel, um auf das neue App-Label zu verweisen.
    • Aktualisieren Sie Vorlagen für generische klassenbasierte Ansichten (der Standardpfad lautet<app_label>/<model_name>_<suffix>.html )
    • Führen Sie Raw SQL aus, um Migrationen und Apps zu korrigieren content_types(leider ist einige Raw SQL unvermeidbar). Sie können dies nicht in einer Migration ausführen.

      UPDATE django_migrations
         SET app = 'catalogue'
       WHERE app = 'shop';
      
      UPDATE django_content_type
         SET app_label = 'catalogue'
       WHERE app_label = 'shop';
    • Stellen Sie sicher, dass keine Migrationen erforderlich sind (überprüft den vorherigen Schritt).

  3. Benennen Sie die Tabellen um :
    • "Benutzerdefiniert" entfernen db_table.
    • Führen Sie es aus, makemigrationsdamit django die Tabelle "auf die Standardeinstellung" umbenennen kann.
  4. Verschieben Sie die Dateien :
    • Modulverzeichnis umbenennen.
    • Importe korrigieren.
    • Aktualisieren Sie die App-Konfigurationen name.
    • Aktualisieren Sie, wo INSTALLED_APPSauf die App-Konfiguration verwiesen wird.
  5. Aufräumen :
    • Entfernen Sie die benutzerdefinierte App-Konfiguration, wenn sie nicht mehr benötigt wird.
    • Wenn die App-Konfiguration nicht mehr vorhanden ist, vergessen Sie nicht, sie auch aus zu entfernen INSTALLED_APPS.

Beispiellösung: Ich habe ein App-Rename-Beispiel erstellt , ein Beispielprojekt, in dem Sie sehen können, wie ich eine App nacheinander umbenannt habe.

Das Beispiel verwendet Python 2.7 und Django 1.8, aber ich bin zuversichtlich, dass der gleiche Prozess mindestens für Python 3.6 und Django 2.1 funktioniert.

meshy
quelle
1
Danke @meshy. Es hat mir wirklich geholfen, eine riesige App umzubenennen. Ein Vorschlag: Nach dem Ausführen der letzten Migration können Sie alle Migrationsdateien löschen und die anfängliche Migrationsdatei neu erstellen. Dies ist hilfreich, wenn Sie kontinuierliche Integrationstests durchführen. Andernfalls kann das CI die Testdatenbank nicht erstellen.
Rohan
Ich hatte dies in der Erwartung geschrieben, dass Migrationen nach Abschluss des Prozesses von Grund auf neu ausgeführt werden können. Wenn die Migrationen fehlschlugen, hat vielleicht einer von uns etwas verpasst. Ich werde darüber nachdenken und prüfen, ob ich noch weitere Schritte hinzufügen muss.
Meshy
@Rohan Gibt es Informationen, die Sie bereitstellen könnten, um genau zu beschreiben, wie die Migrationen fehlgeschlagen sind?
Meshy
Wenn Sie den Test lokal mit den alten Migrationsdateien ausführen, können Sie sehen, dass die Tabellen @meshy
Rohan
1
Dieser Spielplan hat bei mir perfekt funktioniert. Solange jeder Schritt durch alle aktiven Checkout-Vorgänge (CI, andere Entwickler, Produktion usw.) bereitgestellt wird, bevor der nächste Schritt ausgeführt wird, hat er einwandfrei funktioniert - keine Probleme mit den vorhandenen historischen Migrationen. Führen Sie die Schritte der Reihe nach aus und verbreiten Sie die Änderungen überall, bevor Sie mit dem folgenden Schritt fortfahren.
user85461
11

Wenn Sie PyCharm verwenden und das Projekt nach dem Umbenennen nicht mehr funktioniert:

  1. Bearbeiten Sie die Run / Debug-Konfiguration und ändern Sie die Umgebungsvariable DJANGO_SETTINGS_MODULE, da sie Ihren Projektnamen enthält.
  2. Gehen Sie zu Einstellungen / Sprachen & Frameworks / Django und aktualisieren Sie den Speicherort der Einstellungsdatei.
Maziyar Mk
quelle
1
Dies ist eine dieser Situationen, in denen das Finden und Ersetzen fehlgeschlagen ist. Vielen Dank für den Hinweis.
Ruaanvds
0

Re-Migrate-Ansatz für eine sauberere Platte.

Dies ist problemlos möglich, wenn andere Apps keine Fremdschlüsselmodelle aus der umzubenennenden App verwenden. Überprüfen Sie, ob in den Migrationsdateien keine Migrationen von dieser Datei aufgeführt sind.

  1. Sichern Sie Ihre Datenbank. Speichern Sie alle Tabellen mit a) Daten + Schema für mögliche zirkuläre Abhängigkeiten und b) nur Daten zum erneuten Laden.
  2. Führen Sie Ihre Tests aus.
  3. Überprüfen Sie den gesamten Code in VCS.
  4. Löschen Sie die Datenbanktabellen der umzubenennenden App.
  5. Löschen Sie die Berechtigungen: delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
  6. Inhaltstypen löschen: delete from django_content_type where app_label = '<OldAppName>'
  7. Benennen Sie den Ordner der App um.
  8. Ändern Sie alle Verweise auf Ihre App auf ihrer Abhängigkeiten, dh die App views.py, urls.py‚manage.py‘ und settings.pyDateien.
  9. Migrationen löschen: delete from django_migrations where app = '<OldAppName>'
  10. Wenn die models.pyMeta-Klasse Ihres app_nameBenutzers aufgeführt ist, benennen Sie diese ebenfalls um (von @will erwähnt).
  11. Wenn Sie Ihre staticoder templatesOrdner in Ihrer App mit einem Namespace versehen haben , müssen Sie diese auch umbenennen. Benennen Sie beispielsweise old_app/static/old_appan new_app/static/new_app.
  12. Wenn Sie die App-Konfiguration in apps.py definiert haben; Benennen Sie diese um und benennen Sie ihre Referenzen in settings.INSTALLED_APPS um
  13. Migrationsdateien löschen.
  14. Führen Sie Migrationen erneut durch und migrieren Sie.
  15. Laden Sie Ihre Tabellendaten aus Backups.
mehmet
quelle
0

Wenn Sie Pycharm verwenden , ist das Umbenennen einer App mit Refactoring ( Shift+ F6Standard) für alle Projektdateien sehr einfach .
Stellen Sie jedoch sicher, dass Sie die __pycache__Ordner im Projektverzeichnis und seinen Unterverzeichnissen löschen . Seien Sie auch vorsichtig, da auch Kommentare umbenannt werden, die Sie im angezeigten Refactor-Vorschaufenster ausschließen können.
Und Sie müssen OldNameConfig (AppConfig): in apps.pyIhrer umbenannten App zusätzlich umbenennen .

Wenn Sie keine Daten Ihrer Datenbank verlieren möchten, müssen Sie dies manuell mit einer Abfrage in der Datenbank wie der oben genannten Antwort tun.

Subangkar KrS
quelle
-2

Verwenden Sie einfach die Option Suchen und Ersetzen. (Jeder Code-Editor hat es)?

Zum Beispiel Visual Studio Code (unter Bearbeiten):

Visual Studio Code-Option: 'In Dateien ersetzen'

Sie geben einfach den alten und den neuen Namen ein und ersetzen alles im Projekt mit einem Klick.

HINWEIS : Hiermit werden nur Dateiinhalte umbenannt, NICHT Datei- und Ordnernamen. Vergessen Sie nicht, Ordner umzubenennen, z. templates/my_app_name/benenne es um intemplates/my_app_new_name/

elano7
quelle