Backend/Django
[Django] AbstractUser를 사용한 UserModel 확장
mirae.kwak
2022. 7. 6. 11:51
AbstractUser
django에서 제공하는 사용자 모델로 기본적인 사용자 정보에 대해 이미 구현되어 있어 편리하게 관련 기능을 구현할 수 있다. 하지만 추가적으로 필요한 사용자 데이터가 있을 수 있기 때문에 AbstractUser를 커스텀하여 사용할 수 있다.
기본적으로 제공하는 필드
- id : PK
- username
- first_name
- last_name
- password
- is_staff
- is_activate
- is_superuser
- last_login
- data_joined
User Model Custom
1. AbstractUser에 존재하는 필드 이외에 필요한 필드에 대해서 추가적으로 정의해준다.
- 추가적으로 존재하는 필드가 없긴했지만 새로 정의해주었다.
from django.db import models
from django.contrib.auth.models import AbstractUser
class Users(AbstractUser):
id = models.AutoField(primary_key=True, db_column='user_id')
username = models.CharField(max_length=20, unique=True)
email = models.EmailField(
verbose_name='email address', max_length=255, unique=True)
password = models.CharField(max_length=300, null=False)
2. 정의한 User Model을 설정한다.
# settings.py
AUTH_USER_MODEL = 'ncteApp.Users'
3. admin 페이지에서 확인하기 위해 User Model을 등록한다.
# admin.py
from django.contrib.auth.admin import UserAdmin
from .models import Users
admin.site.register(Users, UserAdmin)
내가 겪은 문제
UserModel 설정의 경우 프로젝트를 생성한 초기에 해주는 것이 좋다. User Model을 따로 설정해주면 django가 테이블을 만들 때 auth_user 모델을 생성하지 않고 내가 정의한 모델로 만들어주기 때문이다.
즉 테이블을 만들기 전에 설정을 완료해주어야한다.
나의 경우 데이터베이스 연결 후 테이블을 이미 만든 후에 설정을 바꾸어 주었는데 makemigrations부터 다시 했지만 계속해서 오류가 났다. 이런 오류,,,,
Unknown column 'users.last_login' in 'field list'
구글링했지만 관련 에러가 많이 없기도 했고 해결책이 딱히 없었다.
결국 찾은 방식은 table을 재생성해주기!
프로젝트 완전 초기라 존재하는 데이터가 딱히 없다면 이 방식을 추천한다.
- migrations 폴더 삭제
- __pycache__ 폴더 안의 모델관련 파일 삭제
- database table drop
위를 모두 한 후에 다음 명령어로 테이블을 재생성한다.
python manage.py makemigrations [app name]
python manage.py migrate