programing

짱고 앱 이름 바꾸는 방법?

prostudy 2022. 3. 21. 09:07
반응형

짱고 앱 이름 바꾸는 방법?

나는 장고에 있는 앱의 이름을 폴더 이름, 수입 이름 및 모든 참조(템플릿/인덱스)로 바꿔 이름을 바꿨다.하지만 지금 나는 달리기를 시도할 때 이런 오류가 발생한다.python manage.py runserver

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

이 오류를 디버깅하고 해결하려면 어떻게 해야 하는가?단서라도?

다음 단계에 따라 장고에서 앱 이름을 변경하십시오.

  1. 프로젝트 루트에 있는 폴더 이름 바꾸기
  2. 종속성(앱의 종속성)에서 앱에 대한 참조를 변경하십시오.views.pyurls.pymanage.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. .7) (Django >= 1.7의 경이)를 업데이트한다.django_migrations이전 마이그레이션이 다시 실행되지 않도록 하기 위한 표:UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'. 참고: 이 단계가 장고 1.8+에 필요한지 여부에 대한 논쟁이 있다. 만약 누군가가 확실히 알고 있다면 여기를 업데이트하십시오.
  6. 만약 당신이models.py의 메타 클래스는app_name나열된 항목도 이름을 변경하십시오(@will에서 언급함).
  7. 만약 당신이 당신의 이름을 앞지른다면static또는templates앱에 있는 폴더도 이름을 변경하십시오.예를 들어, 이름 바꾸기old_app/static/old_appnew_app/static/new_app.
  8. django 이이름 models, 너는 변해야 할 필요가 있을 것이다.django_content_type.name입력. postgrepostgre용. 사용, 사UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
  9. 업데이트 16Jul2021: 또한__pycache__/앱 내부의 폴더를 제거해야 하며 그렇지 않으면EOFError: marshal data too short when trying to run the server @ 언급되었다. @세히이 쿠쉬첸코에 의해 언급됨

메타 포인트(virtualenv를 사용하는 경우):가상 환경을 포함하는 디렉토리의 이름을 변경할 경우, 해당 환경에는 절대 경로를 포함하는 여러 파일이 있을 수 있으며 업데이트도 필요할 수 있다는 점에 유의하십시오.다음과 같은 오류가 발생하는 경우ImportError: No module named ...게 인지도 몰라((이것을 제공해준 @danyamachine 덕분).

기타 참조: 아래 링크를 참조하여 보다 완벽한 그림을 확인하십시오.

  1. 장고와 남장으로 앱 이름 바꾸기
  2. 짱고 앱에서 모델을 새 모델로 마이그레이션하려면 어떻게 해야 하는가?
  3. 짱고 앱 이름 바꾸는 방법?
  4. 남부 장고를 사용한 역이동
  5. Django/South를 사용하여 모델 이름을 변경하는 가장 쉬운 방법?
  6. Python 코드(A덕분)Raouf)를 사용하여 위의 단계(테스트되지 않은 코드)를 자동화하십시오.경고를 받았다!)
  7. 위의 단계(시험되지 않은 코드)를 자동화하는 Python 코드(라파포니만 덕택)경고를 받았다!)

New in 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/

재밌는 문제!곧 많은 앱의 이름을 바꿔야 할 것 같아 건성으로 실행했다.

이 방법은 당신이 이름을 바꾸고 있는 앱에서 작업하는 다른 개발자들의 혼란을 최소화하기 위해 원자력 단계에서 진척될 수 있도록 한다.

작업 예제 코드는 이 답변 하단의 링크를 참조하십시오.

  1. 이동할 기존 코드 준비:
    • 앱 구성 생성(설정)name그리고label(기본값)
    • 앱 구성 추가 위치INSTALLED_APPS.
    • 모든 모델에서 명시적으로 설정db_table현재 값까지
    • 의사 마이그레이션:db_table"항상" 명시적으로 정의되었다.
    • 마이그레이션이 필요하지 않은지 확인하십시오(이전 단계 확인).
  2. 앱 레이블 변경:

    • 세트label새 앱 이름에 대한 앱 구성.
    • 새 앱 레이블을 참조하도록 마이그레이션 및 외부 키 업데이트
    • 일반 클래스 기반 보기에 대한 템플릿 업데이트(기본 경로는 )
    • 원시 SQL을 실행하여 마이그레이션 수정 및content_typesapp(불행히도 일부 원시 SQL은 피할 수 없다).마이그레이션에서는 이 작업을 실행할 수 없음.

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

  3. 테이블 이름 바꾸기:
    • "사용자 정의" 제거db_table.
    • 달리다makemigrations그래서 django는 테이블의 이름을 "기본값"으로 바꿀 수 있다.
  4. 파일 이동:
    • 모듈 디렉토리 이름을 변경하십시오.
    • 가져오기를 수정하십시오.
    • 앱 구성 업데이트name.
    • 업데이트 위치INSTALLED_APPS앱 구성을 참조하십시오.
  5. 정리:
    • 더 이상 필요하지 않은 경우 사용자 지정 앱 구성을 제거하십시오.
    • 앱 구성이 사라진 경우 앱 구성도 다음에서 제거하십시오.INSTALLED_APPS.

예제 솔루션:내가 앱 이름을 어떻게 바꾸었는지 한 번에 하나씩 볼 수 있는 예시 프로젝트인 앱-레네임-예제를 만들었다.

예시는 파이썬 2.7과 짱오 1.8을 사용하지만 적어도 파이썬 3.6과 짱오 2.1에서도 같은 과정이 통할 것으로 확신한다.

PyCharm을 사용 중이고 프로젝트 이름이 변경된 후 작업이 중지된 경우:

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

많은 경우에 나는 @allcaps의 대답이 잘 통한다고 믿는다.

그러나 코드 가독성을 향상시키거나 혼동을 방지하기 위해 앱 이름을 실제로 변경해야 할 때도 있다.

대부분의 다른 답변은 수동 데이터베이스 조작이나 기존 마이그레이션을 다루는 것인데, 나는 별로 좋아하지 않는다.

대안으로, 나는 원하는 이름으로 새로운 앱을 만들고, 모든 것을 복사하고, 그것이 작동하는지 확인한 다음, 원래의 앱을 제거하는 것을 좋아한다.

  1. 원하는 이름으로 앱을 시작하고 원래 앱의 모든 코드를 복사하십시오.새 앱 이름과 일치하도록 새로 복사한 코드에서 이름이 앞지른 항목을 수정하십시오.

  2. makemigrations, 그리고migrate 키가 때 액세스 수 참고: 앱에 외래 키가 많은 경우 복사된 앱의 초기 마이그레이션을 실행할 때 역방향 접근자를 충돌시키는 문제가 발생할 수 있다.충돌을 해결하려면 이전 앱에서 관련_name 액세스자의 이름을 변경하거나 새 액세스자의 이름을 추가해야 한다.

  3. 원본 앱의 테이블에서 새 앱의 테이블로 관련 데이터를 복사하는 데이터 마이그레이션 생성migrate다시 한 번

이 시점에서, 원래의 앱과 그것의 데이터가 여전히 제자리에 있기 때문에, 모든 것이 여전히 작동한다.

  1. 이제 모든 종속 코드를 리팩터링할 수 있게 되어 새 앱만 사용할 수 있게 되었다.주의할 사항에 대한 예는 다른 답변을 참조하십시오.

  2. 일단 모든 것이 작동한다고 확신하면, 원래의 앱을 제거할 수 있다.이것은 또 다른 (구성표) 이주를 포함한다.

이는 모든 단계가 수동 데이터베이스 조작 없이 정상적인 장고 마이그레이션 메커니즘을 사용하며, 소스 제어의 모든 것을 추적할 수 있다는 장점이 있다.게다가, 우리는 모든 것이 제대로 작동한다고 확신할 때까지 원래의 앱과 그것의 데이터를 제자리에 보관한다.

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

다른 앱이 이름을 바꿀 앱의 키 모델을 외제화하지 않을 경우 이 작업을 쉽게 수행할 수 있다.마이그레이션 파일에 이 마이그레이션의 마이그레이션이 나열되지 않는지 확인하십시오.

  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.pyurls.py, '관리하다.py' , 그리고settings.py파일들
  9. 마이그레이션 삭제:delete from django_migrations where app = '<OldAppName>'
  10. 만약 당신이models.py의 메타 클래스는app_name나열된 항목도 이름을 변경하십시오(@will에서 언급함).
  11. 만약 당신이 당신의 이름을 앞지른다면static또는templates앱에 있는 폴더도 이름을 변경하십시오.예를 들어, 이름 바꾸기old_app/static/old_appnew_app/static/new_app.
  12. apps.py에서 앱 구성을 정의한 경우, 앱의 이름을 변경하고 설정에서 참조의 이름을 변경하십시오.설치됨_
  13. 마이그레이션 파일 삭제.
  14. 마이그레이션을 다시 만들고 마이그레이션하십시오.
  15. 백업에서 테이블 데이터 로드

통증이나 데이터 손실 없이 짱오 프로젝트에서 기존 앱의 이름을 바꾸는 간단한 4단계.

1단계

앱 폴더 이름을 변경하십시오.이 예에서, "old_app"는 우리의 옛 이름이고 "new_app"은 우리의 새로운 이름이다."

mv ./old_app ./new_app

2단계

새 폴더를 참조하도록 이전 폴더를 참조하는 모든 가져오기를 업데이트하십시오.

예를 들면 다음과 같다.

# Before 
from myproject.old_app import models

# After
from myproject.new_app import models

3단계

Django 마이그레이션 내의 이전 앱 이름 참조 업데이트

변경해야 할 예:

# Before

dependencies = [
    ('old_app', '0023_auto_20200403_1050'),
]

# After

dependencies = [
    ('new_app', '0023_auto_20200403_1050'),
]

# Before

field = models.ForeignKey(
    default=None, on_delete=django.db.models.deletion.CASCADE,
    to='old_app.Experiment'
)

# After

field = models.ForeignKey(
    default=None, on_delete=django.db.models.deletion.CASCADE,
    to='new_app.Experiment'
)

4단계

이 지점에서 커밋하십시오.

그런 다음 배포된 환경에서 애플리케이션 마이그레이션을 실행하더라도 해당 프로세스에서 마이그레이션을 실행하기 전에 django_rename_app를 실행하십시오.

즉, "피톤 관리" 전에 관리하십시오.py migrate --noinput"은 아래 예시와 같다.

# Before

python manage.py collectstatic --noinput
python manage.py migrate --noinput
gunicorn my_project.wsgi:application

# After

python manage.py collectstatic --noinput
python manage.py rename_app old_app new_app
python manage.py migrate --noinput
gunicorn my_project.wsgi:application

이렇게 하면 다음 내부 Django 데이터베이스 테이블에서 앱 이름이 업데이트된다.

  • django_content_type
  • 장고_o

그리고 기존 앱 이름이 아닌 새 앱 이름으로 시작하도록 모든 테이블의 접두사 이름을 변경하십시오.

바로 그겁니다.

참고: IDE/텍스트 편집기의 찾기/바꾸기 기능을 사용하여 다양한 파일을 변경하는 것이 좋다.

Pycharm을 사용할 경우 리팩터링(refactoring)으로 앱 이름을 바꾸는 것이 매우 쉽다.Shift+F6모든 프로젝트 파일에 대해 기본값(기본값).
하지만 반드시 삭제하십시오.__pycache__프로젝트 디렉터리 및 하위 디렉터리의 폴더.또한 리팩터 미리보기 창에서 제외할 수 있는 코멘트의 이름도 바꾸므로 주의하십시오.
에서 OldNameConfig(AppConfig)의 할 의 이름을 변경하십시오.apps.py추가적으로 이름을 바꾼 앱도 있고.

데이터베이스의 데이터가 손실되지 않도록 하려면 앞에서 설명한 답변과 같이 데이터베이스의 쿼리를 사용하여 수동으로 수행해야 한다.

찾기 및 바꾸기 옵션을 사용하지 마십시오.(모든 코드 에디터가 가지고 있어)

예: Visual Studio 코드(편집 옵션에서):

Visual Studio Code 옵션: '파일로 바꾸기'

이전 이름과 새 이름을 입력하고 클릭 한 번으로 프로젝트의 모든 호팅을 대체하면 된다.

참고: 파일 및 폴더 이름이 아닌 파일 내용만 변경하십시오.예를 들어 폴더 이름을 변경하는 것을 잊지 마십시오. templates/my_app_name/로 이름을 바꾸다.templates/my_app_new_name/

참조URL: https://stackoverflow.com/questions/8408046/how-to-change-the-name-of-a-django-app

반응형