본문 바로가기

문돌이 존버/Django 스터디

장고(Django), 관계를 표현하는 모델 필드(OneToOneField)

반응형
본 글은 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.pyurls.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'

물론 저도 장고의 깊은 면까지 다 이해는 하지 못했지만 오버라이딩의 위험이 있다면 그 위험을 피할 수 있는 더 안정적인 방법에 익숙해지는 것이 좋다고 생각합니다^^

728x90
반응형