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)
댓글