본 글은 Holix의 "리액트와 함께 장고 시작하기 Complete" 강의를 듣고 작성한 일지입니다.
이번에는 장고의 OneToOneField에 대해 알아보고자 합니다. OneToOneField는 1:1 관계에서 어느 쪽이라도 가능합니다. 앞서 배웠던 ForeignKey(unique=True)와 유사하지만 reverse 측면에서 차이를 보입니다.
1. User:Profile를 FK로 지정할 경우:
profile.user_set.first() -> user
2. User:Profile를 O2O로 지정할 경우:
profile.user -> user
새로운 장고 앱 accounts 를 만들어서 직접 살펴보겠습니다.
# models.py
from django.conf import settings
from django.db import models
# Create your models here.
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
address = models.CharField(max_length=100)
zipcode = models.CharField(max_length=6) #, validators = []) <- 숫자만 입력하도록 할 수도 있음
# admin.py
from django.contrib import admin
from .models import Profile
# Register your models here.
@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):
pass
# urls.py
urlpatterns = [
]
기본 프로젝트의 settings.py 와 urls.py 에도 위에서 만든 accounts 앱 정보를 입력해야 합니다. 그리고 admin 페이지로 들어가 새로운 사용자 정보를 입력해주면 됩니다(저의 경우 admin 선택).
python manage.py shell
# from django.contrib.auth.models import User <- 추천하지 않음
from django.contrib.auth import get_user_model # 추천 방식
User = get_user_model()
User.objects.all()
user = User.objects.first()
user.profile # OneToOneField
user.profile.address
참고
위 코드에서 잠깐(?) 스쳐지나갔던 장고에서 기본적으로 제공하는 User 모델을 사용할 때 비추천하는 방식에 대해 잠깐 설명하겠습니다.
우리가 웹 개발을 계속 하다보면 기본 User 모델에 만족하지 못하고 커스터마이징을 해야 할 필요성을 느낄 것입니다. 이때 직접 만든 모델을 적용해야 하는데, 장고의 기본 모델과 충돌을 일으키면 안되겠죠. 이때 위에서 비추천했던 from django.contrib.auth.models import User 를 사용하면 오버라이딩이 될 수 있어 위험합니다.
그래서 안전한 방법이 django.contrib.auth import get_user_model 를 사용하는 것입니다. 이는 models.py 에서도 user 필드를 정할 때 settings.AUTH_USER_MODEL 이라고 설정한 것과 동일한 맥락입니다.
settings.py 파일에서 "현재 활성화된 유저 모델"인 AUTH_USER_MODEL 이 가리키는 대상을 바꿀 수 있는데, 이때 디폴트 값은 장고의 auth.User 입니다.
# settings.py
# AUTH_USER_MODEL: 현재 활성화된 유저 모델을 가리킴
# 커스터마이징한 User 모델을 지정하려면 아래 'auth.User'를 '앱 이름.User'로 바꿔야 함
# django.conf.global_settings.py에 디폴트는 'auth.User'
# AUTH_USER_MODEL = 'auth.User'
물론 저도 장고의 깊은 면까지 다 이해는 하지 못했지만 오버라이딩의 위험이 있다면 그 위험을 피할 수 있는 더 안정적인 방법에 익숙해지는 것이 좋다고 생각합니다^^
'문돌이 존버 > Django 스터디' 카테고리의 다른 글
장고(Django), 마이그레이션을 통한 데이터베이스 스키마 관리(1), (2) (0) | 2021.08.15 |
---|---|
장고(Django), 관계를 표현하는 모델 필드 ManyToManyField (0) | 2021.08.15 |
장고(Django) 관계(relationship)를 표현하는 모델 필드, ForeignKey (0) | 2021.08.07 |
장고(Django) debug toolbar 설치 및 SQL 쿼리문 확인 (0) | 2021.08.07 |
장고(Django) Queryset을 통한 검색 구현 및 정렬(sorting) (0) | 2021.08.07 |