오늘은 Composite Fields를 살펴보겠다.
Composite Fields
1.1 ListField
개체 리스트의 유효성을 검사하는 필드 클래스이다. 이해한 바로는 List를 반환해주고 그 안의 개체들이 선언한 필드인지 아닌지 유효성 검사를 한다.
인수는 다음과 같다
- child - 목록에서 개체의 유효성을 검사하는 데 사용되는 필드 인스턴스이다. 설정하지 않으면 개체의 유효성이 검사되지 않는다.
- allow_empty - 말 그대로 빈 리스트를 허용할지 말지를 설정한다.
- min_length - 최소 개수를 설정한다.
- max_length - 최대 개수를 설정한다.
코드를 살펴보자. 예제는 해당 사이트에서 가져왔다.
# import serializer from rest_framework
from rest_framework import serializers
class Geeks(object):
def __init__(self, integers):
self.integers = integers
# create a serializer
class GeeksSerializer(serializers.Serializer):
# initialize fields
integers = serializers.ListField(
child = serializers.IntegerField(min_value = 0, max_value = 100)
)
그리고 나서 python 가상 환경에 접근해서 사용해보자
>>> obj = Geeks([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> serializer = GeeksSerializer(obj)
>>> serializer.data
{'integers': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}
만약 이때 문자열이 들어간다면 오류를 뱉는다.
>>> obj = Geeks([1, 'aaa'])
>>> serializer = GeeksSerializer(obj)
>>> serializer.data
....
ValueError: invalid literal for int() with base 10: 'aaa'
1.2 DictField
ListField와 유사하다. DIctField의 키는 항상 문자열 값으로 가정한다.
인수는 다음과 같다
- child - dict의 유효성을 검사하는 데 사용되는 필드 인스턴스이다. 설정하지 않으면 개체의 유효성이 검사되지 않는다.
- allow_empty - 말 그대로 빈 리스트를 허용할지 말지를 설정한다..
아래의 예제로 이해해보자
from rest_framework import serializers
class Document(object):
def __init__(self, document: dict):
self.document = document
# create a serializer
class DocumentSerializer(serializers.Serializer):
# initialize fields
document = serializers.DictField(
child = serializers.CharField())
클래스를 선언한 다음, 아래의 코드를 입력해보자.
>>> document = {'document': {'title': 'awesome'}}
>>> doc = Document(document)
>>> doc_serializer = DocumentSerializer(doc)
>>> doc_serializer.data
{'document': {'document': "{'title': 'awesome'}"}}
또한 다음과 같이 유효성 검사를 할 수도 있다.
>>> doc_serializer = DocumentSerializer(data=document})
>>> doc_serializer.is_valid()
True
>>> doc_serializer.data
{'document': {'title': 'awesome'}}
1.3 HStoreField
장고의 PostGres HStoreField와 호환되는 DIctFIeld이다.
인수는 DictField와 같다.
1.4 JSONFIeld
들어오는 데이터 구조가 유효한 JSON 요소로 구성되어 있는지 확인하는 필드 클래스이다. 바이너리 모드에서는 JSON으로 인코딩된 이진 문자열을 표현하고 검증한다.
인수는 다음과 같다.
- binary - True로 설정하면 binary 데이터 구조가 아닌 JSON 인코딩 문자열을 출력하고 검증한다. 기본값은 False 이다.
- encoder - 이 인코더를 사용하여 입력 개체를 직렬화한다. 기본값은 None이다.
from rest_framework import serializers
class Geeks(object):
def __init__(self, json_data):
self.json_data = json_data
# create a serializer
class GeeksSerializer(serializers.Serializer):
# initialize fields
json_data = serializers.JSONField()
# create a json object
>>> import json
>>> x = json.dumps({"name":"Naveen", "Age":"21"})
>>> x
'{"name": "Naveen", "Age": "21"}'
# create a object of type Geeks
>>> obj = Geeks(x)
# serialize the object
>>> serializer = GeeksSerializer(obj)
# print serialized data
>>> serializer.data
{'json_data': '{"name": "Naveen", "Age": "21"}'}
다음에는 Miscellaneous Field에 대해 살펴보겠다.
참고
1. https://www.django-rest-framework.org/api-guide/fields/
2. https://www.geeksforgeeks.org/listfield-in-serializers-django-rest-framework/
3. https://www.geeksforgeeks.org/dictfield-in-serializers-django-rest-framework/
4. https://www.geeksforgeeks.org/jsonfield-in-serializers-django-rest-framework/
'Django' 카테고리의 다른 글
[Pytest] - django-dotenv 와 pytest-dotenv 오류 (0) | 2022.12.19 |
---|---|
[DRF] - Serializers Class 알아보기(1) (0) | 2022.12.14 |
Django Queryset - Lazy QuerySet 과 올바른 Caching 사용법 (0) | 2022.12.09 |
[DRF - Django Rest Framework] Serializer Field 톺아보기(2) (0) | 2022.12.07 |
[DRF - Django Rest Framework] Serializer Field 톺아보기(1) (0) | 2022.11.30 |