티스토리 뷰

오늘 배운 것 정리

 

어제에 이어서 오늘 타임어택을 구현하던 중 Serializers 의 데이터 검증에 대해서 이해가 덜된 부분에 대해서 파악을 했다.

 

Serializers 를 사용할 때 deserialize 를 한다. 이 때 데이터 검증을 하면서 serializer를 통하지 않은 데이터를 걸러주기 때문에 필요한 데이터가 있다면 serializer 의 validation을 통과할 수 있도록 값을 전달해줘야 한다. 

 

이러한 방법 중 하나는 SerializerMethodField 가 있다.

 

SerializerMethodField

 read-only field로 value가 있는 serializer class에 있는 메소드를 호출함으로 value를 얻는다. 이는 어떤 종류의 데이터가  오브젝트의 serialized representation 에 추가되는데 사용될 수 있다.

 

Signature: SerializerMethodField(method_name=None)

 

method_name - serializer의 메소드의 이름은 호출될 수 있다. get_<field_name> 디폴트로 포함되지 않는다면

serializer 메소드, 즉 memthod_name 인자는 단일 인자를 승인해야 하며 이는 오브젝트를 serialized 해야 한다. 이것은 어떤 값을 원하던 간에 오브젝트의 serialized representation 포함되어 return 되어야 한다. 

 

더보기

This is a read-only field. It gets its value by calling a method on the serializer class it is attached to. It can be used to add any sort of data to the serialized representation of your object.

Signature: SerializerMethodField(method_name=None)

  • method_name - The name of the method on the serializer to be called. If not included this defaults to get_<field_name>.

The serializer method referred to by the method_name argument should accept a single argument (in addition to self), which is the object being serialized. It should return whatever you want to be included in the serialized representation of the object.

출처 :

Django REST framework - SerializerMethodField

 

예시 코드:

from django.contrib.auth.models import User
from django.utils.timezone import now
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    days_since_joined = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = '__all__'

    def get_days_since_joined(self, obj):
        return (now() - obj.date_joined).days

 

오늘 퀴즈 에서의 예시

 

글작성자의 value 를 반환받고 싶을때 SerializerMethodField 에 넣어서 검증을 해준다.

 

EX1)

views.py 중

class ArticleView(APIView):
    def get(self, request):
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)

    def post(self, request):
        print(request.user)
        # print(request.username)
        # print(request.id)
        serializer = ArticleCreateSerializer(data=request.data)
        if serializer.is_valid(): 
            serializer.save(author=request.user)
            return Response(serializer.data)
        else:
            return Response(serializer.errors)

serializers.py 중

class ArticleSerializer(serializers.ModelSerializer):

    class Meta:
        model = Article
        fields = '__all__'


class ArticleCreateSerializer(serializers.ModelSerializer):
    author = serializers.SerializerMethodField()

    def get_author(self, obj):
        return obj.author.username
    
    class Meta:
        model = Article
        fields = ("title", "content", "id", "author")

 

 

 

EX2)

views.py 중

class ArticleView(APIView):
    def get(self, request):
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)

 

serializers.py 중

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'

        extra_kwargs={
            'author': {'read_only':True}
        }

 

 

혹은 어제처럼 serializer를 회피하는 방법도 있을 수 있다. 하지만 이럴 경우에 Response를 통해서 데이터를 어떻게 전달해줄 수 있는지 추가 조사가 필요하다.

 

 

참조 :

Donnis Dev-note - [Django] 장고 Form 과 Serializer 비교

guava.log - Serializer를 통한 유효성 검사 및 저장

人CoDom - DjangoDRF-Serializer

IT엘도라도 - [Django] REST framework - ① Serialization

kyleee.log - TIL51 - what is difference json and dictionary?

oen.log - [Django] SerializerMethodField로 모델 필드 값을 변형해서 새로운 필드로 반환하기

 


TIL_20221027

 

Serializers

Serializers 는 쿼리셋과 모델인스턴스와 같이 복잡한 데이터를 native Python 데이터형으로 변환할 수 있게 하며 이는 JSON, XML 혹은 다른 종류의 컨텐츠 타입으로 쉽게 렌더링 될 수 있다. Serializers 는 deserialization을 제공하는데 이는 분석된 데이터를 최초 검증(validation)하고 나서 다시 복잡한 데이터셋으로 변환할 수 있다.

 

Validation

데이터를 deserializing 할때 항상 is_valid()를 호출해야 된다. 검증된 데이터에 접근을 시도하기 전에 혹은 오브젝트 인스턴스를 저장하기 전에. 어떤 종류의 validation 에러가 발생하면, .error 프로퍼티가 에러 메시지 결과를 대표하는 dictionary를 포함하고 있다.

 

Validation 할때 input data를 Serializer의 fields를 통해 검증한다. 

다른 값이 필요하면 따로 넣어줘야 한다.

 

EX)

serializers.py 중

class ArticleCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ("title", "image", "content")

 

views.py 중

    def post(self, request):
        print(request.user)
        print(request.data)
        serializer = ArticleCreateSerializer(data=request.data)
        if serializer.is_valid(): #fields 안에 값들을 확인해서 valid
            serializer.save(user=request.user)
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

 

 

참조 :

Django REST framework - Serializers

stackoverflow - Django serializers: What does is_valid actually do?

수학과의 좌충우돌 프로그래밍 - [Django] Serializer 를 통한 유효성 검사 및 저장

 


오늘 한 일

1. 장고 심화 강의(django rest framework) 공부 (test)

'What I Learned' 카테고리의 다른 글

TIL_20221101_CSR, SSR, SPA  (0) 2022.11.02
TIL_20221031_WS, WAS, Proxy, CDN, SSH  (0) 2022.10.31
WIL_221024to221028_내일배움캠프9주차  (0) 2022.10.30
TIL_20221027_장고 Serializers  (0) 2022.10.28
TIL_20221026_토큰, JWT  (0) 2022.10.26
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함