Django 앱의 이름을 변경하는 방법은 무엇입니까?


156

Django에서 폴더 이름, 가져 오기 및 모든 참조 (템플릿 / 색인)의 이름을 변경하여 앱 이름을 변경했습니다. 그러나 지금 실행하려고하면이 오류가 발생합니다.python manage.py runserver

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

이 오류를 어떻게 디버깅하고 해결할 수 있습니까? 단서가 있습니까?


안녕하세요 danihp. 네, 있어요. 나는 또한 virtualenv를 사용하고 있는데, 그것이 관련이 있는지 모르겠습니다.
André

1
PyCharm을 사용하고 있다면 우연히이 rename기능이 도움이 될 것입니다.
Anto

1
사우스가 그런 작업을 지원하지 않습니까?
andilabs

답변:


285

Django에서 앱 이름을 변경하려면 다음 단계를 따르십시오.

  1. 프로젝트 루트에있는 폴더의 이름을 바꾸십시오
  2. 자신의 의존성에 응용 프로그램에 대한 참조를 변경 응용 프로그램의 즉 views.py, urls.py'manage.py'을하고,settings.py 파일을.
  3. django_content_type다음 명령으로 데이터베이스 테이블 을 편집하십시오 .UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
  4. 또한 모델이있는 경우 모델 테이블의 이름을 바꿔야합니다. postgres의 경우을 사용하십시오 ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName. mysql의 경우도 마찬가지라고 생각합니다 (@null_radix에서 언급했듯이)
  5. (Django> = 1.7의 경우) django_migrations이전 마이그레이션이 다시 실행되지 않도록 테이블을 업데이트하십시오 UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'. 참고 :이 단계가 Django 1.8 이상에 필요한 경우 몇 가지 토론이 있습니다 (의견). 누군가 알고 있다면 여기에서 업데이트하십시오.
  6. 귀하의 경우 models.py의 메타 클래스가app_name 나열, 확인 (@will 언급)도 그 이름을 변경 할 수 있습니다.
  7. 앱 내부 static또는 templates폴더에 네임 스페이스를 지정한 경우 이름을 바꿔야합니다. 예를 들어로 이름 old_app/static/old_app을 바꿉니다 new_app/static/new_app.
  8. django의 이름을 바꾸 models려면 django_content_type.nameDB의 항목 을 변경해야합니다 . postgreSQL 사용UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'

메타 포인트 (virtuenv를 사용하는 경우) : virtualenv 가 포함 된 디렉토리의 이름을 바꾸는 경우 env에 절대 경로가 포함 된 여러 파일이있을 수 있으며 업데이트해야합니다. 이와 같은 오류가 발생 ImportError: No module named ...하면 범인 일 수 있습니다. (@danyamachine에게 감사드립니다).

다른 참조 : 더 완벽한 그림을 보려면 아래 링크를 참조하십시오

  1. Django와 South로 앱 이름 바꾸기
  2. 하나의 장고 앱에서 새 모델로 모델을 어떻게 마이그레이션합니까?
  3. Django 앱의 이름을 변경하는 방법은 무엇입니까?
  4. Django South를 통한 이전 마이그레이션
  5. Django / South를 사용하여 모델의 이름을 바꾸는 가장 쉬운 방법은 무엇입니까?
  6. 위의 단계를 자동화하는 Python 코드 ( A.Raouf 덕분에 ) (테스트되지 않은 코드. 경고되었습니다!)
  7. 위의 단계를 자동화하는 Python 코드 ( rafaponieman 덕분에 ) (테스트되지 않은 코드. 경고되었습니다!)

3
또한 모델이있는 경우 모델 테이블의 이름을 바꿔야합니다. postgres 사용 ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
null_radix

11
새 마이그레이션을 사용하는 경우 기존 마이그레이션 파일 및 django_migrations 테이블에서 앱 이름을 변경해야합니다. 마이그레이션을 먼저 스쿼시하는 것이 좋을 수 있으므로 편집이 줄어 듭니다.
제임스

7
Postgres의 경우 시퀀스 이름도 바꾸려면을 사용하십시오 ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;. 꼭 필요한 것은 아니지만 시스템 자체는 이름에 신경 쓰지 않습니다. DEFAULT 열은 OID( 'foo_pkey_seq'::regclass)을 저장하며 , OID는 동일하게 유지됩니다.
Konstantine Kalbazov

3
James가 마이그레이션 파일 업그레이드 (예 : 종속성 모듈 이름) 에 대해 말한 내용을 포함하도록 답변을 업데이트하면 도움이 될 것 입니다.
u3l

2
@SrikarAppalaraju의 솔루션에 따라 모델 이름을 바꿀 수있는 관리 명령은 다음과 같습니다. gist.github.com/rafaponieman/201054ddf725cda1e60be3fe845850a5 old_name, new_name 및 클래스를 매개 변수 (모든 데이터베이스 테이블 및 필드에서 볼 때 형식화 됨)로 허용합니다.
rafaponieman

32

Django 1.7의 새로운 기능은 구성을 저장하고 내성을 제공하는 앱 레지스트리입니다. 이 기계를 사용하면 몇 가지 앱 속성을 변경할 수 있습니다.

내가 만들고 싶은 요점은 항상 앱 이름을 바꿀 필요는 없다는 것입니다. 앱 구성을 사용하면 충돌하는 앱을 해결할 수 있습니다. 또한 앱에 친숙한 이름이 필요한 경우 갈 길도 있습니다.

예를 들어 설문 조사 앱의 이름을 '사용자의 피드백'으로 지정하고 싶습니다. 다음과 같이 진행됩니다.

디렉토리에 apps.py파일을 작성하십시오 polls.

from django.apps import AppConfig

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

에 기본 앱 구성을 추가하십시오 polls/__init__.py.

default_app_config = 'polls.apps.PollsConfig'

더 많은 앱 구성 : https://docs.djangoproject.com/en/1.7/ref/applications/


13

재미있는 문제! 곧 많은 앱의 이름을 바꿔야하므로 드라 이런을했습니다.

이 방법을 사용하면 이름을 바꾸는 앱에서 작업하는 다른 개발자의 방해를 최소화하기 위해 원자 단계로 진행할 수 있습니다.

예제 코드 예제는이 답변의 맨 아래에있는 링크를 참조하십시오.

  1. 이동을 위해 기존 코드를 준비하십시오 .
    • 앱 구성을 만듭니다 ( 기본값 namelabel기본값으로 설정 ).
    • 에 앱 구성을 추가하십시오 INSTALLED_APPS.
    • 모든 모델 db_table에서 현재 값 으로 명시 적으로 설정 하십시오.
    • db_table"항상"명시 적으로 정의 되도록 닥터 마이그레이션 .
    • 마이그레이션이 필요하지 않은지 확인하십시오 (이전 단계 확인).
  2. 앱 라벨 변경 :

    • label앱 구성에서 새 앱 이름으로 설정하십시오 .
    • 새 앱 레이블을 참조하도록 마이그레이션 및 외래 키를 업데이트하십시오.
    • 일반 클래스 기반보기의 템플리트 업데이트 ( 기본 경로는<app_label>/<model_name>_<suffix>.html )
    • 원시 SQL을 실행하여 마이그레이션 및 content_types앱 을 수정하십시오 (불행히도 일부 원시 SQL은 피할 수 없습니다). 마이그레이션에서이를 실행할 수 없습니다.

      UPDATE django_migrations
         SET app = 'catalogue'
       WHERE app = 'shop';
      
      UPDATE django_content_type
         SET app_label = 'catalogue'
       WHERE app_label = 'shop';
    • 마이그레이션이 필요하지 않은지 확인하십시오 (이전 단계 확인).

  3. 테이블 이름을 바꾸십시오 .
    • "custom"을 제거하십시오 db_table.
    • makemigrationsdjango가 테이블의 이름을 "기본값"으로 바꿀 수 있도록 실행하십시오 .
  4. 파일을 이동하십시오 .
    • 모듈 디렉토리의 이름을 바꾸십시오.
    • 수입품을 수정하십시오.
    • 업데이트 응용 프로그램의 설정입니다 name.
    • INSTALLED_APPS앱 구성을 참조하는 위치를 업데이트 하십시오.
  5. 정리 :
    • 더 이상 필요하지 않은 경우 사용자 지정 앱 구성을 제거하십시오.
    • 앱 구성이 사라지면에서 제거하는 것을 잊지 마십시오 INSTALLED_APPS.

솔루션 예 : app-rename-example을 만들었습니다 . 한 번에 한 번 커밋하는 방법으로 앱 이름을 바꾸는 방법을 볼 수있는 예제 프로젝트입니다.

이 예제는 Python 2.7 및 Django 1.8을 사용하지만 동일한 프로세스가 적어도 Python 3.6 및 Django 2.1에서 작동한다고 확신합니다.


1
감사합니다 @meshy. 정말 큰 앱의 이름을 바꾸는 데 도움이되었습니다. 한 가지 제안은 마지막 마이그레이션을 실행 한 후 모든 마이그레이션 파일을 삭제하고 초기 마이그레이션 파일을 다시 생성하여 지속적인 통합 테스트를 수행하는 경우 도움이 될 수 있습니다. 그렇지 않으면 CI가 테스트 데이터베이스를 생성하지 못합니다.
Rohan

프로세스가 완료되면 마이그레이션을 처음부터 실행할 수있을 것으로 예상했습니다. 이주가 실패하면 우리 중 한 명이 뭔가를 놓쳤을 것입니다. 그것에 대해 생각하고 추가해야 할 다른 단계가 있는지 확인합니다.
meshy

@Rohan 마이그레이션이 어떻게 실패했는지 자세히 설명 할 수있는 정보가 있습니까?
meshy

이전 마이그레이션 파일을 사용하여 로컬로 테스트를 실행하면 @meshy
Rohan

1
이 게임 계획은 저에게 완벽하게 작동했습니다. 다음 단계를 수행하기 전에 각 단계가 모든 활성 체크 아웃 (CI, 기타 개발자, 생산 등)을 통해 배포되는 한 기존의 이전 마이그레이션에는 문제가 없었습니다. 다음 단계로 이동하기 전에 단계를 순서대로 수행하고 모든 위치에 변경 사항을 전파하십시오.
user85461

11

PyCharm을 사용 중이고 이름을 바꾼 후 프로젝트 작동이 중지 된 경우 :

  1. 프로젝트 이름을 포함하므로 실행 / 디버그 구성을 편집하고 환경 변수 DJANGO_SETTINGS_MODULE을 변경하십시오.
  2. 설정 / 언어 및 프레임 워크 / 장고로 이동하여 설정 파일 위치를 업데이트하십시오.

1
이것은 찾기 및 바꾸기가 실패한 상황 중 하나입니다. 이것을 지적 해 주셔서 감사합니다.
ruaanvds

0

클리너 플레이트에 대한 접근 방식을 다시 마이그레이션하십시오.

다른 앱이 이름을 바꿀 앱의 외래 키 모델이 아닌 경우에도 쉽게 수행 할 수 있습니다. 마이그레이션 파일에이 마이그레이션 파일이 없는지 확인하고 확인하십시오.

  1. 데이터베이스를 백업하십시오. 가능한 순환 종속성에 대한 a) 데이터 + 스키마 및 b) 다시로드 할 데이터만으로 모든 테이블을 덤프하십시오.
  2. 테스트를 실행하십시오.
  3. 모든 코드를 VCS에 체크인하십시오.
  4. 이름을 바꿀 앱의 데이터베이스 테이블을 삭제하십시오.
  5. 권한을 삭제하십시오. delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
  6. 컨텐츠 유형을 삭제하십시오. delete from django_content_type where app_label = '<OldAppName>'
  7. 앱의 폴더 이름을 바꿉니다.
  8. 자신의 의존성에 응용 프로그램에 대한 참조를 변경 응용 프로그램의 즉 views.py, urls.py'manage.py', 그리고settings.py 파일을.
  9. 마이그레이션 삭제 : delete from django_migrations where app = '<OldAppName>'
  10. 귀하의 경우 models.py의 메타 클래스가있다app_name 나열, 확인 (@will 언급)도 그 이름을 변경 할 수 있습니다.
  11. 앱 내부 static또는 templates폴더에 네임 스페이스를 지정한 경우 이름을 바꿔야합니다. 예를 들어로 이름 old_app/static/old_app을 바꿉니다 new_app/static/new_app.
  12. apps.py에서 앱 구성을 정의한 경우; 설정에서 이름을 바꾸고 참조의 이름을 바꿉니다.
  13. 마이그레이션 파일을 삭제하십시오.
  14. 마이그레이션을 다시 만들고 마이그레이션하십시오.
  15. 백업에서 테이블 데이터를로드하십시오.

0

Pycharm 을 사용하는 경우 모든 프로젝트 파일에 대해 리팩토링 ( Shift+ F6기본값)으로 앱 이름을 바꾸는 것이 매우 쉽습니다 .
그러나 __pycache__프로젝트 디렉토리와 하위 디렉토리에서 폴더 를 삭제하십시오 . 또한 리 팩터 미리보기 창에서 표시 할 수있는 주석의 이름도 바뀌므로주의하십시오.
또한 apps.py이름이 바뀐 앱에서 OldNameConfig (AppConfig)의 이름을 바꿔야 합니다.

데이터베이스의 데이터를 잃지 않으려면 위에서 언급 한 답변과 같은 데이터베이스의 쿼리로 수동으로 수행해야합니다.


-3

찾기 및 바꾸기 옵션 만 사용하십시오. (모든 코드 편집기에 있음)?

예를 들어 Visual Studio Code (편집 옵션 아래) :

Visual Studio 코드 옵션 : '파일에서 바꾸기'

이전 이름과 새 이름을 입력하고 프로젝트의 모든 항목을 한 번의 클릭으로 바꿉니다.

참고 : 파일 및 폴더 이름이 아닌 파일 내용 만 바꿉니다. 예를 들어 폴더 이름 바꾸기를 잊지 마십시오. templates/my_app_name/이름을templates/my_app_new_name/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.