오늘은 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
인수는 다음과 같다.
- 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/
Serializer fields - Django REST framework
www.django-rest-framework.org
2. https://www.geeksforgeeks.org/listfield-in-serializers-django-rest-framework/
ListField in serializers - Django REST Framework - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
3. https://www.geeksforgeeks.org/dictfield-in-serializers-django-rest-framework/
DictField in serializers - Django REST Framework - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
4. https://www.geeksforgeeks.org/jsonfield-in-serializers-django-rest-framework/
JSONField in serializers - Django REST Framework - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
'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 |