python tutorial - Wie ändere ich den Namen einer Django App?




example how (5)

Ich habe den Namen einer App in Django geändert, indem ich seinen Ordner, Importe und alle seine Referenzen (Vorlagen / Indizes) umbenannte. Aber jetzt bekomme ich diesen Fehler, wenn ich versuche, python manage.py runserver

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

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


Answers

Re-migrieren Ansatz für eine sauberere Platte.

Dies kann schmerzlos erfolgen, wenn andere Apps keine Fremdschlüsselmodelle aus der App umbenennen sollen. Überprüfen Sie und stellen Sie sicher, dass ihre Migrationsdateien keine Migrationen von diesem auflisten.

  1. Sichern Sie Ihre Datenbank. Dump alle Tabellen mit a) Daten + Schema für mögliche zirkuläre Abhängigkeiten und b) nur Daten für das erneute Laden.
  2. Führen Sie Ihre Tests durch.
  3. Überprüfen Sie den gesamten Code in VCS.
  4. Löschen Sie die Datenbanktabellen der App, die umbenannt werden soll.
  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. Löschen von Inhaltstypen: 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 in ihren Abhängigkeiten, z. B. in den Dateien views.py , urls.py , manage.py und settings.py der App.
  9. Migrationen delete from django_migrations where app = '<OldAppName>' : delete from django_migrations where app = '<OldAppName>'
  10. Wenn die Meta-Klasse von app_name aufgelistet hat, vergewissere app_name , dass app_name sie ebenfalls umbenennst (wird von @will erwähnt).
  11. Wenn Sie Ihre static Ordner oder templates in Ihrer App mit einem Namespace versehen haben, müssen Sie diese ebenfalls umbenennen. old_app/static/old_app Sie z. B. old_app/static/old_app in new_app/static/new_app .
  12. Wenn Sie in apps.py die App-Konfiguration definiert haben Benenne sie um und benenne ihre Referenzen in settings.INSTALLED_APPS um
  13. Löschen Sie Migrationsdateien.
  14. Führen Sie Migrationen erneut durch und migrieren Sie.
  15. Laden Sie Ihre Tabellendaten aus den Sicherungen.

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

  1. Bearbeiten Sie die Run / Debug-Konfiguration und ändern Sie die Umgebungsvariable DJANGO_SETTINGS_MODULE, da diese den Projektnamen enthält.
  2. Gehe zu Einstellungen / Sprachen & Frameworks / Django und aktualisiere den Speicherort der Einstellungsdatei.

Befolgen Sie diese Schritte, um den Namen einer App in Django zu ändern:

  1. Benennen Sie den Ordner um, der sich in Ihrem Projektstamm befindet
  2. Ändern Sie alle Verweise auf Ihre App in ihren Abhängigkeiten, z. B. in den Dateien views.py , urls.py , manage.py und settings.py der App.
  3. Bearbeiten Sie die Datenbanktabelle django_content_type mit 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 Sie ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName . Auch für mysql denke ich, es ist das gleiche (wie von @null_radix erwähnt)
  5. (Für Django> = 1.7) Aktualisieren Sie die Tabelle django_migrations , damit die vorherigen Migrationen nicht erneut ausgeführt werden: UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>' . Hinweis : Es gibt eine Debatte (in Kommentaren), ob dieser Schritt für Django 1.8+ erforderlich ist; Wenn jemand sicher weiß, bitte hier aktualisieren.
  6. Wenn die Meta-Klasse von app_name aufgelistet hat, vergewissere app_name , dass app_name sie ebenfalls umbenennst (wird von @will erwähnt).
  7. Wenn Sie Ihre static Ordner oder templates in Ihrer App mit einem Namespace versehen haben, müssen Sie diese ebenfalls umbenennen. old_app/static/old_app Sie z. B. old_app/static/old_app in new_app/static/new_app .
  8. Um Django- models umzubenennen, müssen django_content_type.name Eintrag django_content_type.name in der django_content_type.name ändern. Für postgreSQL verwenden Sie UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'

Meta-Punkt (Wenn Sie virtualenv verwenden): Beachten Sie, dass wenn Sie das Verzeichnis umbenennen, das Ihr virtualenv enthält, es wahrscheinlich mehrere Dateien in Ihrem env geben wird, die einen absoluten Pfad enthalten und auch aktualisiert werden müssen. Wenn Sie Fehler wie ImportError: No module named ... das könnte der Schuldige sein. (Danke an @danyamachine für die Bereitstellung dieses).

Andere Referenzen: Sie können auch die folgenden Links für ein vollständigeres Bild beziehen

  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. Einfachste Möglichkeit, ein Modell mit Django / South umzubenennen?
  6. Python-Code (Danke an A.Raouf ) um die obigen Schritte zu automatisieren (ungetesteter Code. Sie wurden gewarnt!)
  7. Python-Code (danke an rafaponieman ), um die obigen Schritte zu automatisieren (ungetesteter Code. Sie wurden gewarnt!)

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

Der Hauptpunkt, den ich machen möchte, ist, dass das Umbenennen einer App nicht immer notwendig ist: Mit App-Konfiguration ist es möglich, in Konflikt stehende Apps zu lösen. Aber auch der Weg, wenn deine App eine freundliche Namensgebung benötigt.

Als ein Beispiel möchte ich meine Umfragen-App 'Feedback von Benutzern' nennen. Es geht so:

Erstellen Sie eine Datei " apps.py " im polls :

from django.apps import AppConfig

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

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

default_app_config = 'polls.apps.PollsConfig'

Für weitere App-Konfiguration: https://docs.djangoproject.com/en/1.7/ref/applications/


Versuche dies:

collections.namedtuple()

Im Grunde namedtuples sind namedtuples einfach zu erstellende, leichtgewichtige Objekttypen. Sie machen Tupel zu praktischen Behältern für einfache Aufgaben. Mit namedtuples müssen Sie keine Ganzzahlindizes für den Zugriff auf Member eines Tupels verwenden.

Beispiele:

Code 1:

>>> from collections import namedtuple

>>> Point = namedtuple('Point','x,y')

>>> pt1 = Point(1,2)

>>> pt2 = Point(3,4)

>>> dot_product = ( pt1.x * pt2.x ) +( pt1.y * pt2.y )

>>> print dot_product
11

Code 2:

>>> from collections import namedtuple

>>> Car = namedtuple('Car','Price Mileage Colour Class')

>>> xyz = Car(Price = 100000, Mileage = 30, Colour = 'Cyan', Class = 'Y')

>>> print xyz

Car(Price=100000, Mileage=30, Colour='Cyan', Class='Y')
>>> print xyz.Class
Y




python django