이번에는 1차프로젝트인 wish korea를 리펙토링 하려고 합니다.
앱이름들은 현재 DB테이블명으로 되어있어서 이를 수정하는 방법에 대해 블로깅 하려고 합니다.
우선은 stack overflow에 나와있는 방법입니다.
https://stackoverflow.com/questions/8408046/how-to-change-the-name-of-a-django-app
How to change the name of a Django app?
I have changed the name of an app in Django by renaming its folder, imports and all its references (templates/indexes). But now I get this error when I try to run python manage.py runserver Error:...
stackoverflow.com
- 프로젝트 루트에 있는 폴더 이름 바꾸기
- 종속성(예: 앱의 views.py, urls.py, manage.py및 settings.py파일)에서 앱에 대한 모든 참조를 변경합니다.
- django_content_type다음 명령을 사용 하여 데이터베이스 테이블을 편집합니다 .UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
- 또한 모델이 있는 경우 모델 테이블의 이름을 바꿔야 합니다. 포스트그레스의 경우 ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName. mysql의 경우에도 동일하다고 생각합니다(@null_radix가 언급한 대로).
- (Django >= 1.7의 경우) django_migrations이전 마이그레이션이 다시 실행되지 않도록 테이블을 업데이트합니다. UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'. 참고 : Django 1.8+에서 이 단계가 필요한지에 대해서는 의견이 분분합니다. 누군가 확실히 알고 있다면 여기에서 업데이트하십시오.
- models.py의 메타 클래스가 목록에 있는 경우 app_name이름도 변경해야 합니다(@will이 언급).
- static앱 내에서 또는 templates폴더 의 이름을 지정한 경우 해당 이름도 변경해야 합니다. 예를 들어 이름 old_app/static/old_app을 new_app/static/new_app.
- django 의 이름을 바꾸 려면 DB에서 항목 models을 변경해야 합니다 . django_content_type.namePostgreSQL의 경우 다음을 사용하십시오.UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
- 2021년 7월 16일 업데이트 : 또한 __pycache__/앱 내부의 폴더를 제거해야 합니다. 그렇지 않으면 EOFError: marshal data too short when trying to run the server. @Serhii Kushchenko 언급
간략히 정리해보기
- 앱 폴더이름 바꾸기
- 해당 앱의 apps.py의 Config클래스의 name속성 바꾸기
- settings.py의 INSTALLED_APPS 내의 앱이름 바꾸기
- urls.py의 include문 경로 바꾸기
- DB 테이블내의 app속성들 바꾸기
1. django_content_type 테이블의 app_labels컬럼 수정하기
2.django_migrations 테이블의 app컬럼 수정하기 - 각종 import문 수정하기
- 해당 폴더하위의 __pycache__ 폴더 지우기
- miagrate 해주기
사실 6번의 각종 import문 수정은 에디터의 도움을 받는게 현실적입니다.
대부분의 에디터는 1번에서 폴더이름 바꿀때 아마 자동수정에대한 동의 화면이 나올 것 입니다.
우선 저는 users앱을 auth로 바꾸는 작업을 해보겠습니다.
환경
python, django, mysql
1.앱 폴더이름 바꾸기
VS코드 사용시 아래와 같은 화면이 출력 됩니다.
import문을 수정해주는데 꼭!! 수정된 파일들을 저장 버튼을 눌러주셔야 합니다.
이런식으로 저장은 안되고 코드변경만 일어나있는 상태를 가집니다.
2.apps.py의 Config클래스의 name속성 바꾸기
3.settings.py의 INSTALLED_APPS 내의 앱이름 바꾸기
4. urls.py의 include문 경로 바꾸기
저는 project폴더 내의 urls.py의 include문에만 해당 경로가 존재하기에 하나만 변경하겠습니다.
저는 엔드포인트도 변경할 것이기에 path의 첫 인자도 바꿔주었지만 엔드포인트의 변경이 없다면
include 함수의 인자만 변경하여주면 됩니다.
5-1. DB django_content_type 테이블 속성 수정
아래는 django_content_type 테이블 데이터들입니다.
app과 테이블이 매핑되어있는 테이블인것 같습니다
update django_content_type set app_label='auth' where app_label='users';
명령어 입력후 테이블을 다시 조회하면
수정된것을 확인할 수 있습니다.
혹여 SQL에 대한 문법적 이해가 없는분들을 위해 간략히 설정 드리자면
update 테이블이름 set 수정할컬럼=수정값 where 대상
update django_content_type set app_label='auth' where app_label='users';
#수정 이 테이블을 app_label속성을'auth'로 app_label속성이 'users'인 레코드를
5-2. django_migration 테이블 속성 수정
해당 테이블은 migrate시 읽어들인 migrations파일과 읽은 날짜 그리고 각각 앱의 정보를 관리합니다ㅏ.
아래의 명령어로 수정하여 줍니다.
update django_migrations set app='auth' where app='users';
변경이 완료된것을 볼 수 있습니다.
pycache 폴더 삭제하기
저는 각각 앱과 프로젝트 폴더 하위의 모든 파이캐시를 삭제하였습니다
migrate 해주기
저는 이런 오류가 났습니다.
오류의 이유는 FK설정시 순환참조 때문에 문자열로 경로를 지정하였기때문에 이부분또한 수정해주어야 하기 때문입니다.
이것을 수정하고 다시 migrate해준다면
django.db.migrations.exceptions.NodeNotFoundError:
Migration auth.0004_user_refresh_token dependencies
reference nonexistent parent node ('users', '0003_rename_adress_user_address')
이런오류가 발생했습니다. migrations 파일의 문제인것 같습니다.
이 디펜던시 부분의 문제인것같아 전부 수정해줬습니다.
(FK로 묶여있던 orders앱의 migrations 파일까지 모두 수정해주었습니다.)
또에러
ValueError: The field orders.Cart.user was declared with a lazy reference to 'users.user', but app 'users' isn't installed.
The field orders.Order.user was declared with a lazy reference to 'users.user', but app 'users' isn't installed.
이번문제는 migrations 파일의 operations의 FK중 to속성의 값 문자열 때문입니다..
이것까지 수정하니 모두 완료되었습니다......
(ManyToMany의 경우에는 through필드까지 확인하여야 합니다)
사실 다들 삭제하고 다시만드는것을 추천한다는데 왜인지 알것같네요...
추가 발견 에러
related_model._meta.object_name,
AttributeError: 'str' object has no attribute '_meta'
위와 관련된 에러는 ManyToMany 필드의 첫인자로 대상 클래스를 경로문자열로 하였을때 발생하였습니다.
products -> product로 변경중 발견하였습니다.
예상으로는 해당 문자열이 잘못된경로기에 경로가아닌 단순 문자열로 인식한것 같습니다.
'Python > Django' 카테고리의 다른 글
[Django] 장고에서 TIME_ZONE & USE_TZ 파헤치기 (0) | 2023.01.06 |
---|---|
[Django] Django Custom Manager 클래스 사용해보기 (0) | 2023.01.01 |
[Django] Models class Manager (0) | 2022.06.26 |
[Django] ver.3 피드백 모음 (0) | 2022.06.19 |
[Django] Westagram 회원가입 기능 작성해보기 ver.3 (0) | 2022.06.13 |