일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- API
- Algorithm
- c++
- 파이썬
- django widget
- django ORM
- Git
- Django
- HTML
- django rest framework
- 장고
- AWS
- CSS
- PYTHON
- js
- form
- 알고리즘 문제
- 알고리즘 연습
- javascript
- MAC
- DRF
- Baekjoon
- react
- 백준
- 알고리즘
- web
- java
- 파이썬 알고리즘
- 알고리즘 풀이
- es6
- Today
- Total
수학과의 좌충우돌 프로그래밍
[Django] Serializer Custom Field, SerializerMethodField 본문
django rest framework 를 사용하여 rest API 서버를 만들다보면 serializer 를 사용하지 않을 수 가 없습니다.
기본적으로 model 에 등록된 필드 값들은 Meta 클래스에 추가줌으로서 다뤄줄 수 있지만 커스텀 필드를 정의하는데 있어서는 새로운 방법이 필요합니다.
이번 포스팅에서는 간단하게 Custom Field 만드는 법에 대해서 알아보도록 하겠습니다.
SerializerMethodField
SerializerMethodField
를 사용하여 쉽게 커스텀 할 수 있습니다.
SerializerMethodField
는 read-only field
로 값을 저장하거나 수정할 때는 사용되지 않고 조회할 때만 사용합니다.
인자로는 method_name
로 해당 필드값에 대해 정의하는 함수의 이름을 넘겨줍니다.
지정해주지 않을 경우 default 로는 get_<field_name>
로 지정해줄 수 있습니다.
예시를 통해 살펴보겠습니다.
# serializers.py
from rest_framework import serializers as sz
class ReviewSerializer(sz.ModelSerializer):
class Meta:
model = Review
fields = (
'profile',
'content',
'created_at'
)
댓글에 대한 ReviewSerializer
를 정의하였습니다.
fields 로는 작성자, 내용, 작성날짜를 지정해주었습니다.
이 때 Review
모델은 Profile
모델과 ForeignKey로 연결되어 있습니다.
따라서 profile
의 id 값이 저장되어 있기 때문에 해당 serializer 로 데이터를 조회해도 id 값이 조회됩니다.
따라서 id 값으로 사용자의 이름을 추가적으로 불러와야 하는 문제가 생깁니다.
따라서 SerializerMethodField
를 통해서 이를 커스텀 하도록 하겠습니다.
# serializers.py
from rest_framework import serializers as sz
class ReviewSerializer(sz.ModelSerializer):
username = sz.SerializerMethodField()
def get_username(self, obj):
return obj.profile.nickname
class Meta:
model = Review
fields = (
'username',
'profile',
'content',
'created_at'
)
get_username
을 통해 username
의 값을 지정해주며 obj 으로는 해당 모델의 obj이 들어오게 됩니다.
마지막으로 fields 에 명시해주면 해당 필드도 serializer 조회 시 return하게 됩니다.
'웹프로그래밍 > DRF' 카테고리의 다른 글
[Django] DRF Browsable API에 로그인 기능 추가 (0) | 2020.05.03 |
---|---|
[Django] APIView에 permission 지정하기 (1) | 2020.02.26 |
[Django] CORS, Cross-Origin Resource Sharing (0) | 2020.02.14 |
[Django] Token 인증 적용하기, TokenAuthentication (3) | 2020.01.14 |
[Django] rest_framework default 설정 (0) | 2020.01.08 |