Zmieniłem nazwę aplikacji w Django, zmieniając nazwę jej folderu, importu i wszystkich jej odniesień (szablonów / indeksów). Ale teraz pojawia się ten błąd, kiedy próbuję uruchomićpython manage.py runserver
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings
Jak mogę debugować i rozwiązać ten błąd? Jakieś wskazówki?
rename
funkcja bardzo ci w tym pomoże.Odpowiedzi:
Wykonaj następujące kroki, aby zmienić nazwę aplikacji w Django:
views.py
,urls.py
, „” manage.py isettings.py
plików.django_content_type
za pomocą następującego polecenia:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
. Dla mysql też myślę, że to to samo (o czym wspomniał @null_radix)django_migrations
tabeli, aby uniknąć konieczności Twoje poprzednie migracje ponownie uruchomić:UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'
. Uwaga : istnieje pewna dyskusja (w komentarzach), czy ten krok jest wymagany dla Django 1.8+; Jeśli ktoś wie na pewno, zaktualizuj tutaj.models.py
meta klasa zostałaapp_name
wymieniona, pamiętaj, aby zmienić jej nazwę (wspomnianą przez @will).static
lubtemplates
w aplikacji, musisz również zmienić ich nazwy. Na przykład zmień nazwęold_app/static/old_app
nanew_app/static/new_app
.models
, musisz zmienićdjango_content_type.name
wpis w DB. Do użytku z PostgreSQLUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
Meta punkt (jeśli używasz virtualenv): Warto zauważyć, że jeśli zmieniasz nazwę katalogu zawierającego virtualenv, prawdopodobnie w twoim pliku env będzie kilka plików, które zawierają bezwzględną ścieżkę i również będą wymagały aktualizacji. Jeśli otrzymujesz błędy, takie jak
ImportError: No module named ...
ten, może to być przyczyną. (dzięki @danyamachine za zapewnienie tego).Inne odniesienia: możesz również odnieść się do poniższych linków, aby uzyskać pełniejszy obraz
źródło
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;
. Chociaż nie jest to konieczne, sam system nie dba o nazwę. Kolumna DEFAULT przechowujeOID
('foo_pkey_seq'::regclass
), możesz zmienić nazwę sekwencji bez przerywania jej - OID pozostaje taki sam.Nowością w Django 1.7 jest rejestr aplikacji, który przechowuje konfigurację i zapewnia introspekcję. Ta maszyna umożliwia zmianę kilku atrybutów aplikacji.
Główną kwestią, którą chcę podkreślić, jest to, że zmiana nazwy aplikacji nie zawsze jest konieczna: dzięki konfiguracji aplikacji można rozwiązać konfliktowe aplikacje. Ale także do zrobienia, jeśli Twoja aplikacja wymaga przyjaznego nazewnictwa.
Jako przykład chcę nazwać moją aplikację ankietową „Opinie użytkowników”. To wygląda tak:
Utwórz
apps.py
plik wpolls
katalogu:Dodaj domyślną konfigurację aplikacji do
polls/__init__.py
:Więcej konfiguracji aplikacji: https://docs.djangoproject.com/en/1.7/ref/applications/
źródło
Zabawny problem! Wkrótce będę musiał zmienić nazwy wielu aplikacji, więc wykonałem próbę.
Ta metoda umożliwia dokonywanie postępów w atomowych krokach, aby zminimalizować zakłócenia dla innych programistów pracujących nad aplikacją, której nazwę zmieniasz.
Zobacz link na dole tej odpowiedzi, aby uzyskać działający przykładowy kod.
name
ilabel
na domyślne).INSTALLED_APPS
.db_table
na bieżącą wartość.db_table
były „zawsze” wyraźnie zdefiniowane.Zmień etykietę aplikacji :
label
w konfiguracji aplikacji na nową nazwę aplikacji.<app_label>/<model_name>_<suffix>.html
)Uruchom surowy SQL, aby naprawić migracje i
content_types
aplikację (niestety, niektóre surowe SQL są nieuniknione). Nie możesz tego uruchomić podczas migracji.Upewnij się, że migracje nie są wymagane (sprawdź poprzedni krok).
db_table
.makemigrations
aby django mogło zmienić nazwę tabeli na „domyślną”.name
.INSTALLED_APPS
odwołuje się do konfiguracji aplikacji.INSTALLED_APPS
.Przykładowe rozwiązanie: stworzyłem app-rename-example , przykładowy projekt, w którym możesz zobaczyć, jak zmieniłem nazwę aplikacji, po jednym zatwierdzeniu na raz.
W przykładzie użyto Pythona 2.7 i Django 1.8, ale jestem pewien, że ten sam proces będzie działał przynajmniej na Pythonie 3.6 i Django 2.1.
źródło
Jeśli używasz PyCharm i projekt przestaje działać po zmianie nazwy:
źródło
Podejście ponownej migracji w celu uzyskania czystszej płytki.
Można to zrobić bezboleśnie, JEŚLI inne aplikacje nie mają modeli kluczy obcych z aplikacji, której nazwa ma zostać zmieniona. Sprawdź i upewnij się, że ich pliki migracji nie zawierają żadnych migracji z tego.
delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
delete from django_content_type where app_label = '<OldAppName>'
views.py
,urls.py
, „” manage.py isettings.py
plików.delete from django_migrations where app = '<OldAppName>'
models.py
meta klasa zostałaapp_name
wymieniona, pamiętaj, aby zmienić jej nazwę (wspomnianą przez @will).static
lubtemplates
w aplikacji, musisz również zmienić ich nazwy. Na przykład zmień nazwęold_app/static/old_app
nanew_app/static/new_app
.źródło
Jeśli używasz Pycharm , zmiana nazwy aplikacji jest bardzo łatwa dzięki refaktoryzacji (
Shift
+F6
domyślnej) dla wszystkich plików projektu.Ale pamiętaj, aby usunąć
__pycache__
foldery w katalogu projektu i jego podkatalogach. Uważaj również, ponieważ zmienia również nazwy komentarzy, które możesz wykluczyć w oknie podglądu refaktora, które pokaże.Ponadto będziesz musiał zmienić nazwę OldNameConfig (AppConfig): in
apps.py
swojej aplikacji o zmienionej nazwie.Jeśli nie chcesz stracić danych swojej bazy danych, będziesz musiał to zrobić ręcznie za pomocą zapytania w bazie danych, takiego jak wyżej wymieniona odpowiedź.
źródło
Dlaczego nie skorzystać po prostu z opcji Znajdź i zamień. (każdy edytor kodu to ma)?
Na przykład Visual Studio Code (w opcji Edycja):
Po prostu wpisujesz starą i nową nazwę i zamieniasz wszystko w projekcie jednym kliknięciem.
UWAGA : Spowoduje to zmianę nazwy tylko zawartości pliku, a NIE nazw plików i folderów. Nie zapomnij o zmianie nazw folderów, np.
templates/my_app_name/
zmień jego nazwę natemplates/my_app_new_name/
źródło