티스토리 뷰
인스타그램 클론 코딩을 하다보니 Django가 기본적으로 제공하는 User 모델에서 더 필요한 필드가 있었다.
구글링을 해보니 대부분의 글이 User 모델 자체를 재정의하고 있었다. (PK를 username이 아닌 email로 하기 위한)
그러나 나는 필드만 몇 가지 추가하면 되었기 때문에 다음과 같은 방법을 찾았다.
1. 프로젝트를 새로 시작하는 경우 - migration 하기 전
이 경우는 User 모델을 확장하기 가장 쉽고 깔끔한 경우이다.
다음 단계에 따라 User 모델을 확장한 후 migration을 하자.
1.1 models.py
우선 User 모델을 확장하거나 커스터마이징하기 위한 함수는 여러가지가 있다. 우리는 필드만 추가할 것이므로
AbstractUser 함수를 불러와야 한다. 이를 사용하면 기존의 auth_user 테이블에 있던 컬럼들을 전부 유지한 채 새로운
컬럼을 추가할 수 있다.
- AbstratUser: User에서 동작은 그대로 하고 필드만 재정의할 때 사용
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
profile_img_src = models.CharField(max_length=150, blank=True)
profile_msg = models.TextField(max_length=500, blank=True)
birth_date = models.DateField(null=True, blank=True)
1.2 settings.py
새로 정의한 User를 기존의 auth_user 모델을 대신하여 사용하기 위해 setting.py
에 다음 필드를 추가한다.
# settings.py
...
AUTH_USER_MODEL = 'AppName.User'
...
1.3 migration
python manage.py makemigrations
python manage.py migrate
migrations을 한 후 데이터베이스를 확인해보면 우리가 추가한 필드가 들어가있는 것을 확인할 수 있다.
2. 프로젝트를 어느 정도 진행한 경우 - migration을 한 번이라도 한 경우
(새로운 데이터베이스로 갈아탈 수 있어야 함)
migration을 한 번이라도 했다면 위 단계를 그대로 따라하고 migration 명령을 실행했을 때 다음과 같은 에러가 발생한다.
이 에러는 admin
의 migration 파일이 accounts
앱의 0001_initial
migration 파일에 의존적이다는 메시지이다.
즉, admin
사이트에도 모델이 있는데 이것이 AUTH_USER_MODEL
에 의존적이어서 문제가 생기는 것이다. 새로운 앱을
migrate 할 때는 빈 데이터베이스에 admin
앱과 새로운 앱이 같이 migration 되어서 문제가 없었는데, 이미 admin
앱
이 migration 된 상태에서 새로운 User 모델을 migrate 하려니 에러가 발생한다.
따라서, migration 명령을 실행하기 전 다음 단계를 거쳐야 한다.
2.1 새로운 데이터베이스 생성
기존의 데이터베이스는 이미 auth_user 테이블이 생긴 상황이기 때문에 user 모델을 수정하려고 하면 위와 같은 에러가
발생한다. 따라서, 새로운 데이터베이스를 만들고 그 위에 새로 migrtaion을 하는 것이 훨씬 간단하게 처리할 수 있다.
2.2 settings.py 수정
# settings.py
...
#DB 변경
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'New DB NAME',
'USER': 'root',
'PASSWORD': 'Password',
'HOST': '127.0.0.1',
'PORT': 3306,
}
}
...
AUTH_USER_MODEL = 'AppName.User'
...
2.3 migration 파일 삭제
migration 파일들은 DB를 바꿔도 프로젝트에 남아 있다. 이 상태에서 migration 명령을 실행하면 에러가 발생할 가능성이
상당히 높다. 따라서, 이미 migration 명령을 실행한 적이 있다면 이와 관련된 파일을 전부 삭제해야 한다.
migrations 폴더에서 __pycache__
폴더와 __init__.py
파일을 제외한 모든 파일을 삭제한다.
(만일의 경우에 대비해 삭제하기 전에 파일들을 백업하기)
이 단계를 모두 마친 후 다시 migration 명령을 실행하면 에러없이 새로운 DB에 새로운 User 모델이 올라간 것을 볼 수 있다.
3. view에서 확장된 User 모델 사용하기
Django에서 기본으로 제공하는 User 모델은 auth 프레임워크가 제공하는 것이다.
그래서 우리가 User 모델을 사용할 때 다음과 같이 import를 한다.
...
from django.contrib.auth.models import User
...
그러나 User 모델을 확장하거나 커스터마이징을 한 후 migrate를 시키면 데이터베이스에 다음과 같이 테이블이 생성된다.
즉, auth가 아닌 확장을 진행한 models.py가 있는 app의 이름으로 User 테이블이 생성된다.
따라서, 다음과 같이 User 모델을 import 시켜야 사용할 수 있다.
...
from app_name.models import User
...
참고 자료
'Django' 카테고리의 다른 글
[Django Basic 13] default_storage (0) | 2020.02.26 |
---|---|
[Django Basic 12] Static File & Media File (0) | 2020.02.26 |
[Django basic 10] Django Autentication (0) | 2020.02.15 |
[Django Basic 09] {% csrf_token %} (0) | 2020.02.09 |
[Django Basic 08] URL Reverse (0) | 2020.02.09 |
- Total
- Today
- Yesterday
- Django 어플리케이션
- 서점 어플리케이션
- Django 해시태그
- MySQL
- 파이썬
- 장고
- Django application
- Django 로그아웃
- Django 좋아요
- java
- Django 프로젝트 생성
- python
- query parameter
- Django 인스타그램
- Redis
- Django Instagram
- Redis Cache
- Django 컬렉션
- 북마크 어플리케이션
- Django 업로드
- Django 비밀번호 수정
- Django 회원 정보 수정
- Django 로그인
- Django 회원가입
- Django 검색
- Django 팔로우
- Django
- Django User
- Django 북마크
- Django 댓글
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |