본문 바로가기

개발일지/TIL

TIL 23-05-16 drf - serializer 알아보기

1. drf - serializer 알아보기 

 문제점

view에서 serializer 상태 확인하기

 시도해 본 것들

print(serializer)해보기

user = get_object_or_404(User, id=id)
serializer = UserProfileEditSerializer(user, data=request.data)

# request.data
UserProfileEditSerializer(<User: sm990303@naver.com>, data=<QueryDict: 
{'password': ['1234'], 'nickname': ['test'], 'identify': ['1234']}>):  

# user
    identify = CharField(label='아이디', read_only=True)
    nickname = CharField(allow_null=True, label='닉네임', max_length=10, required=False)
    profile_img = ImageField(allow_null=True, label='프로필 사진', max_length=100, required=False)
    fav_alcohol = ChoiceField(allow_blank=True, allow_null=True, choices=[('SOJU', '소주'), ('BEER', '맥주'), ('WINE', '와인'), ('LIQUOR', '양주'), ('TAKJU', '탁주'), ('ETC', '기타'), ('NO', '응답하지 않음')], label='주종', required=False)
    amo_alcohol = ChoiceField(allow_blank=True, allow_null=True, choices=(('BABY', '알쓰'), ('CHOBO', '술찌'), ('JUNGSU', '애주가'), ('GOSU', '술 꾼'), ('GOD', '디오니소스')), label='주량', required=False)
    password = CharField(label='비밀번호', max_length=128, write_only=True)

request.data와 serializer에서 선언된 model의 fields가 출력된다. 

 

print(dir(serializer))해보기

['Meta', '__class__', '__class_getitem__', '__deepcopy__', '__delattr__', '__dict__', '__dir__', 
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__',
'__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', 
'__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', 
'__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_args', '_context', '_creation_counter', 
'_declared_fields', '_get_model_fields', '_kwargs', '_read_only_defaults', '_readable_fields', 
'_writable_fields', 'allow_null', 'bind', 'build_field', 'build_nested_field', 'build_property_field', 
'build_relational_field', 'build_standard_field', 'build_unknown_field', 'build_url_field', 
'context', 'create', 'data', 'default', 'default_empty_html', 'default_error_messages', 
'default_validators', 'error_messages', 'errors', 'fail', 'field_name', 'fields', 'get_attribute', 
'get_default', 'get_default_field_names', 'get_extra_kwargs', 'get_field_names', 'get_fields', 
'get_initial', 'get_unique_for_date_validators', 'get_unique_together_validators', 'get_uniqueness_extra_kwargs', 
'get_validators', 'get_value', 'help_text', 'include_extra_kwargs', 'initial', 'initial_data', 
'instance', 'is_valid', 'label', 'many_init', 'parent', 'partial', 'read_only', 'required', 'root', 
'run_validation', 'run_validators', 'save', 'serializer_choice_field', 'serializer_field_mapping', 
'serializer_related_field', 'serializer_related_to_field', 'serializer_url_field', 'source', 
'style', 'to_internal_value', 'to_representation', 'update', 'url_field_name', 'validate', 
'validate_empty_values', 'validated_data', 'validators', 'write_only']

dir을 한 번 체크해 봤는데 잘 찍혔다. 

 

serializer.validators 확인해 보기 

[]

공백이 나왔다. 

 

공식문서 찾아보기 

https://www.django-rest-framework.org/api-guide/validators/

 

Validators - Django REST framework

 

www.django-rest-framework.org

 

serializer에 validators 추가 

validators = [
            UniqueTogetherValidator(queryset=User.objects.all(), fields=["identify"])
        ]

출력 결과 

[<UniqueTogetherValidator(queryset=<QuerySet [<User: >, <User: sm990303@naver.com>, 
<User: sm990303@naver.com>, <User: sm990303@naver.com>, <User: sm990303@naver.com>, 
<User: sm990303@naver.com>, <User: sm990303@naver.com>, <User: sm990303@naver.com>]>, 
fields=['identify'])>]

 

 

 

 알게 된 점

알아보면서 vaildators를 확인하는 것은 성공했지만, 정확한 의미가 무엇인지는 아직 이해하지 못했다. 

저번의 save(), update, create만큼 뭔가 이해된 기분은 아니지만, validators를 serializer에서 사용하기 시작하면 도움이 될 것 같다.

dir()을 활용해서 사용 가능 함수를 확인하고, 공식문서에서 찾아보는 경험을 할 수 있었다.