본문 바로가기
카테고리 없음

DRF serializers.py - views.py 만들기

by abccoco 2022. 6. 22.

DRF serializer를 작성하는 방법을 알아보자!

 

 

serializer 를 사용하기 위해서는 import serializers 를 해주어야 한다.

그리고 serializer 와 연결할 model 을 지정해 주어야 한다.

from rest_framework import serializers

# user 앱의 models.py의 class User을 연결해 준 것이고 as를 사용해 내가 보기 편한데로 이름을 변경해 주었다.
from user.model import User as UserModel

 

serializers.py 에서 class 만들기

user 앱 이라고 생각하고 UserSerializer을 만들어 주겠다.

class UserSerializer(serializers.ModelSerializer):
   class Meta:
        # serializer에 사용할 위에서 import한 model 명
        model = User
        # model에서 사용할 field를 넣어준다.
        fields = ["username", "password", "fullname", "email"]
        # 모든 필드를 사용하고 싶을 경우 fields = "__all__"로 사용

 


serializers.py 와 views.py 연결하기

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import permissions

# permission class
class UserView(APIView): # CBV 방식
    permission_classes = [permissions.AllowAny] # 누구나 view 조회 가능
    # permission_classes = [permissions.IsAdminUser] # admin만 view 조회 가능
    # permission_classes = [permissions.IsAuthenticated] # 로그인 된 사용자만 view 조회 가능

    def get(self, request):
    	# .data를 통해 리스트 형식 데이터로, Response를 통해 json 형식으로 데이터가 변환된다.
        # 최종적으로 josn 형식으로 데이터를 보내주기 위해 이런 방식의 return을 사용한다.
        return Response(UserSerializer(request.user).data)

 

  • serializers.py 에서 역참조하기

UserSerializer에서 UserManagerSerializer의 usermanager 필드 가져올 때 "usermanager" 라고 작성할 수 있지만 그냥 

 "usermanager" 라고만 작성하면  usermanager 의 갯수만 나온다. 이때 안에 있는 데이터를 가져온다면

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserModel
        # 필드에서 역참조 one-to-one
        fileds = ["username", "email", "fullname", "usermanager",]

class UserManagerSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserManagerModel
        fileds = "__all__"
 
 
참조하고자 하는 class를 추가해주면 된다.
여기에서는 model 관계에 따라 usermanager = UserManagerSerializer() 또는 UserManagerSerializer(many=True) 
class 아래 추가해 주면 된다.
class UserSerializer(serializers.ModelSerializer):
    # one-to-one의 경우
    usermanager = UserManagerSerializer()
    # many-to-many 의 경우
    usermanager = UserManagerSerializer(many=True)
    # 기타 # 필드명을 바꾸고 싶다면? source를 사용하면 된다.
    내_맘데로_이름_변경 = UserManagerSerializer(source="usermanager")

    class Meta:
        model = UserModel
        # 필드에서 역참조
        fileds = ["username", "email", "fullname", "usermanager", "필드명_set"]

class UserManagerSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserManagerModel
        fileds = "__all__"

 

Serializer.MethodField 를 사용해 원하는 필드를 생성하기

class UserSerializer(serializers.ModelSerializer):
	# serializers.MethodField() 를 사용해주고
    same_usermanager_users = serializers.MethodField()
    # get_ 이름 (self, obj): 해주고 사용하면 된다
    def get_same_usermanager_users(self, obj):
    	return "Test!!"

    class Meta:
        model = UserModel
        fileds = ["username", "email", "fullname", "usermanager",
        	"same_usermanager_users", ]

 

obj 사용법

새롭게 생성한 필드에 역참조를 통해 내가 원하는 데이터를 넣는 방법.

for 문을 통해 obj에서 역참조할 모델을 선택해 username 들을 가져온다면 이렇게 사용할 수 있다.(역참조의 역참조)

class UserSerializer(serializers.ModelSerializer):
    same_usermanager_users = serializers.MethodField()
    # obj에는 UserModel의 obj이 들어간다 print로 확인 가능
    def get_same_usermanager_users(self, obj):
    	user_list = []
    	for 역참조모델 in obj.역참조모델_set.all():
        	user_list.append(역참조모델.user.username)
    	return user_list

    class Meta:
        model = UserModel
        fileds = ["username", "email", "fullname", "usermanager",
        	"same_usermanager_users", ]

 


* 기타

models.py 와 serializers.py 와 연결해보자.

# 회원가입
def post(self, request):
    user_serializer = UserSerializer(data = request.data)
    user_serializer.is_vaild(raise_exception=True)
    user_serializer.save()
    
    return Response(user_serializer.data, status=status.HTTP_200_OK)

댓글