개요
이 튜토리얼에서는 Django 프로젝트에서 Django MongoDB Extensions의 Django REST 프레임워크 직렬화 프로세서를 사용하는 방법을 학습할 수 있습니다.
Django MongoDB Extensions는 Django MongoDB 백엔드용 추가 개발자 도구가 포함된 패키지입니다. 이 튜토리얼에서는 Django MongoDB Extensions의 직렬화 프로그램을 사용하여 Django REST 프레임워크 API에 MongoDB 특정 필드를 표현하는 방법을 설명합니다.
참고
Django REST 프레임워크는 Django MongoDB Extensions v0.3.0 이상에서 사용할 수 있습니다.
Serializer
Django MongoDB Extensions는 django_mongodb_extensions.rest_framework 모듈에 다음 직렬기를 제공합니다.
MongoModelSerializer: MongoDB 특정 필드가 포함된 Django 모델의 최상위 직렬기입니다.
ObjectIdAutoField을 사용하는 모델의 경우 Django REST 프레임워크ModelSerializer대신 이 직렬기를 사용하세요.MongoModelSerializer는 이베디드된 필드에 대한 직렬기를 자동으로 생성합니다.EmbeddedModelSerializer:
EmbeddedModel클래스용 직렬화 프로그램입니다.MongoModelSerializer은 직속 필드를 자동으로 처리하므로 직속 모델이 표시되는 방식을 사용자 지정하거나 직속 데이터를 쓰기 (write) 위해서만EmbeddedModelSerializer를 정의합니다. 하위 클래스를 모델의 직렬화 프로그램에 명시적 필드로 할당합니다.PolymorphicEmbeddedModelSerializer: 다형성 내장 필드에 대한 직렬화 프로그램입니다.
MongoModelSerializer은 이 직렬화 프로그램을 자동으로 적용하므로 직접 참조할 필요가 없습니다. 다형성 내장 필드는 읽기 전용입니다.
MongoModelSerializer 다음 MongoDB 특정 필드 유형에 대한 올바른 Django REST Framework 필드를 자동으로 생성합니다.
ArrayFieldEmbeddedModelFieldEmbeddedModelArrayFieldPolymorphicEmbeddedModelField(읽기 전용)PolymorphicEmbeddedModelArrayField(읽기 전용)ObjectIdFieldObjectIdAutoField
전제 조건
이 튜토리얼을 시작하기 전에 Django MongoDB 백엔드를 사용하는 Django 프로젝트를 만들어야 합니다. 프로젝트를 만들려면 Django MongoDB 백엔드 시작하기 튜토리얼을 참조하세요.
튜토리얼
다음 단계는 Django MongoDB Extensions를 설치하고 직렬기를 사용하여 Django REST 프레임워크 API에서 MongoDB의 영화 데이터를 모델링하는 방법을 보여줍니다.
파일을 설정합니다.
시작하기 튜토리얼에서 다음 코드가 포함된 models.py 파일을 만들었습니다.
from django.db import models from django.conf import settings from django_mongodb_backend.fields import EmbeddedModelField, ArrayField from django_mongodb_backend.models import EmbeddedModel class Award(EmbeddedModel): wins = models.IntegerField(default=0) nominations = models.IntegerField(default=0) text = models.CharField(max_length=100) class Movie(models.Model): title = models.CharField(max_length=200) plot = models.TextField(blank=True) runtime = models.IntegerField(default=0) released = models.DateTimeField("release date", null=True, blank=True) awards = EmbeddedModelField(Award, null=True, blank=True) genres = ArrayField(models.CharField(max_length=100), null=True, blank=True) class Meta: db_table = "movies" managed = False def __str__(self): return self.title class Viewer(models.Model): name = models.CharField(max_length=100) email = models.CharField(max_length=200) class Meta: db_table = "users" managed = False def __str__(self): return self.name
앱 디렉토리에 이 파일이 포함되어 있는지 확인하세요. 그리고 models.py 파일과 동일한 디렉토리에 serializers.py 파일을 만듭니다.
모델을 직렬화합니다.
ObjectIdAutoField을 사용하는 모델을 직렬화하려면 serializers.py 파일에서 MongoModelSerializer 을 확장하는 직렬화 프로그램을 정의합니다. 다음 예시에서는 Viewer 모델에 대한 직렬화 프로그램을 정의합니다.
from django_mongodb_extensions.rest_framework import MongoModelSerializer from .models import Viewer class ViewerSerializer(MongoModelSerializer): class Meta: model = Viewer fields = "__all__"
내장된 모델을 직렬화합니다.
내장된 모델을 저장하는 필드를 직렬화하려면 내장된 모델에 대한 EmbeddedModelSerializer 을(를) 확장하는 직렬화 프로그램을 정의한 다음 부모 모델의 직렬화 프로그램에서 참조합니다.
Movie 모델과 그에 포함된 Award 모델을 직렬화하려면 serializers.py 파일을 다음과 같이 업데이트하세요.
from django_mongodb_extensions.rest_framework import ( MongoModelSerializer, EmbeddedModelSerializer, ) from .models import ( Viewer, Award, Movie, ) class ViewerSerializer(MongoModelSerializer): class Meta: model = Viewer fields = "__all__" class AwardSerializer(EmbeddedModelSerializer): class Meta: model = Award fields = "__all__" class MovieSerializer(MongoModelSerializer): awards = AwardSerializer() class Meta: model = Movie fields = "__all__"
참고
임베딩된 모델 직렬화 동작
내장된 모델을 직렬화할 때 다음 동작을 유의하세요.
EmbeddedModelSerializerMeta.fields에 명시적으로 나열하지 않는 한 기본 키 필드는 제외됩니다.to_internal_value()메서드는 사전이 아닌 모델 인스턴스를 반환합니다.이베디드된 모델은 직접 저장할 수 없습니다. 대신 부모 모델을 통해 저장하십시오.
모델의 직렬화된 출력을 보십시오.
직렬화 함수를 정의한 후에는 이 함수를 사용하여 모델 인스턴스를 Django REST 프레임워크가 JSON으로 렌더링할 수 있는 기본 데이터 유형의 사전으로 변환할 수 있습니다.
다음 명령을 실행 하여 Python 셸 시작합니다.
python manage.py shell
그런 다음 다음 코드를 실행하여 뷰어에 대한 sample_mflix.users 컬렉션을 쿼리하고 결과를 직렬화합니다.
from sample_mflix.models import Viewer from sample_mflix.serializers import ViewerSerializer viewer = Viewer.objects.get(email="jason_momoa@gameofthron.es") serializer = ViewerSerializer(viewer) serializer.data
data 속성에는 다음 출력과 유사한 뷰어의 직렬화된 표시가 포함됩니다.
{'id': '...', 'name': 'Khal Drogo', 'email': 'jason_momoa@gameofthron.es'}
임베딩 모델의 직렬화된 출력을 확인합니다.
내장된 모델이 포함된 모델을 직렬하면 직렬기는 내장된 모델의 필드를 출력에 중청합니다.
Python shell에서 다음 코드를 실행하여 영화의 sample_mflix.movies 컬렉션을 쿼리하고 결과를 직렬화합니다.
from sample_mflix.models import Movie from sample_mflix.serializers import MovieSerializer movie = Movie.objects.first() serializer = MovieSerializer(movie) serializer.data
직렬화된 출력은 영화 내에 awards 내장 모델을 중청하며 다음과 같은 형식으로 표시됩니다.
{'id': '...', 'title': 'The Great Train Robbery', 'plot': 'A group of bandits stage a brazen train hold-up...', 'runtime': 11, 'released': '1903-12-01T00:00:00Z', 'awards': {'wins': 1, 'nominations': 0, 'text': '1 win.'}, 'genres': ['Short', 'Western']}
다음 단계
Django REST 프레임워크 튜토리얼을 완료한 것을 축하합니다! 이제 Django MongoDB Extensions 직렬기를 사용하여 Django REST 프레임워크 API에서 MongoDB 영화 관련 필드를 나타내는 Django 애플리케이션이 있습니다.
Django REST 프레임워크에 대해 자세히 학습하려면 Django REST 프레임워크 문서를 참조하세요.
Django MongoDB 확장 패키지에 대해 자세히 학습하려면 PyPI의 django-mongodb-extensions 및 GitHub의 django-mongodb-extensions 리포지토리를 참조하세요.