티스토리 뷰

Django

[Django Basic 11] User 모델 확장

Liiot 2020. 2. 17. 17:03

인스타그램 클론 코딩을 하다보니 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) 유저 모델(User Model), AbstractUser를 이용해 변경하기

간단 용어 정리.

medium.com

 

django login 유저 확장 방법 - 김땡땡's blog

장고의 auth 기능은 User 객체를 제공한다. 우리는 기본 default로 이 User 객체로 여러 인증을 구현할 수 있다. User model User model의 기본적으로 있는 여러 필드들이 있다. username 필수사항이다. 150자 이하, 영숫자를 포함하도록 기본적인 vaildate가 있다. first_name 선택사항이다. 30자 이하 last_name 선택사항. 150자 이하 email 선택사항 password 필수 사항. 설정한 암호의

yonghyunlee.gitlab.io

 

장고(Django) 사용자인증 제 1 편

장고(Django) 웹프레임워크에서 기본 제공하는 auth 프레임워크를 이용하여 사용자가입을 구현하는 방법을 설명합니다. 또한 모델폼을 이용하여 쉽게 템플릿을 구현하는 방법을 알아봅니다.

swarf00.github.io

 

'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
댓글