본문 바로가기
Study/Python

Python Django UserProfile Model 추가

by 울트라탱 2018. 10. 30.

django rest framework 를 활용한 로그인을 구현해 보려고 한다. 기본적으로 포함되어 있는 admin 기능에는 auth_user, auth_group 이 있고 기본적인 사용자 정보만을 가지고 있다. 기본 제공 정보가 아닌 추후에 사용할 사용자 정보로서 닉네임, 사진등을 업로드 하기 위해서 모델을 추가한다.

아래소스들의 기본 뼈대는 django rest framework 공식 사이트 QuickStart App 을 그대로 따라 했고 거기에 추가로 UserProfile 만 추가하였다.

Models.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class UserProfile(models.Model):
    user = models.OneToOneField(User, unique=True, on_delete=models.PROTECT)
    nick_name = models.CharField(max_length=50, blank=True)
    company = models.CharField(max_length=50, blank=True)
    photo_path = models.CharField(max_length=200, blank=True)

    # admin 페이지에서 Display 되는 값을 __str__ 로 오버라이드 해줌
    def __str__(self):
        return str(self.user)

auth_user 와는 일대일 관계의 테이블이므로 OneToOneField 를 사용하였다. 마지막줄에 __str__ 은 없어도 되지만 admin 페이지에서 아래 그림과 같이 이름이 나오지 않고 object 라고 애매하게 나오게 된다. admin 페이지를 종종 쓰려면 처음부터 표기 해두는것이 나중을 위해서 좋을듯 하다.

Serializers.py

from django.contrib.auth.models import User, Group
from rest_framework import serializers
from ggworks.ggworks_api.models import UserProfile

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'groups', 'first_name', 'last_name')

class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ('url', 'name')

class UserProfileSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = UserProfile
        fields = ('user', 'nick_name', 'company', 'photo_path')

urls.py

"""ggworks URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:
Function views
    1\. Add an import:  from my_app import views
    2\. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1\. Add an import:  from other_app.views import Home
    2\. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1\. Import the include() function: from django.urls import include, path
    2\. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from rest_framework import routers
from ggworks.ggworks_api import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
router.register(r'user_profiles', views.UserProfileViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

최종 결과

잘 동작한다. 전체적인 소스를 모두 이해하지 못했으나 따라하기만 해도 잘 된다. 다음엔 ViewSet 에 대한 이해를 해보려고 한다. 한참 찾아보았으나 아직 잘 이해는 안간다. CRUD 를 하나씩 만들지 않아도 ViewSet 안에 이미 구현되어 있다? 정도로만 이해하고 있는데 좀더 찾아봐야겠다.

'Study > Python' 카테고리의 다른 글

Python Telegram 메세지 보내기  (0) 2018.10.28
Python Main 함수  (0) 2018.10.28
Python django postgresql 연동  (0) 2018.10.27