对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

使用 Django REST 框架序列化 MongoDB 数据

在本教程中,您可以学习如何在 Django 项目中使用 Django MongoDB Extensions 中的 Django REST 框架 序列化程序。

Django MongoDB Extensions 是一个包,包含针对 Django MongoDB 后端 的其他开发者工具。本教程将向您展示如何使用 Django MongoDB Extensions 中的序列化器来表示 Django REST 框架 API 中的 MongoDB 特定字段。

注意

Django REST 框架在 Django MongoDB 扩展 v0.3.0 及更高版本中可用。

Django MongoDB Extensions 在 django_mongodb_extensions.rest_framework 模块中提供以下序列化器:

  • MongoModelSerializer:包含 MongoDB 特定字段的 Django 模型的顶级序列化器。对于使用 ObjectIdAutoField 的任何模型,请使用此序列化器而不是 Django REST 框架 ModelSerializerMongoModelSerializer 会自动为嵌入字段生成嵌套序列化器。

  • EmbeddedModelSerializerEmbeddedModel 类的序列化器。由于 MongoModelSerializer 会自动处理嵌入字段,因此仅在您想自定义嵌入模型的表示方式或需要写入嵌入数据时才定义 EmbeddedModelSerializer。将子类分配为父模型序列化器上的显式字段。

  • PolymorphicEmbeddedModelSerializer:多态嵌入字段的序列化器。MongoModelSerializer 会自动应用此序列化器,因此您无需直接引用它。多态嵌入字段是只读的。

MongoModelSerializer 自动生成以下 MongoDB 特定字段类型的正确 Django REST 框架字段:

  • ArrayField

  • EmbeddedModelField

  • EmbeddedModelArrayField

  • PolymorphicEmbeddedModelField (只读)

  • PolymorphicEmbeddedModelArrayField (只读)

  • ObjectIdField

  • ObjectIdAutoField

在开始本教程之前,请创建一个使用 Django MongoDB 后端的 Django 项目。要创建项目,请参阅 Django MongoDB 后端入门教程。

以下步骤展示如何安装 Django MongoDB 扩展并使用其序列化器在 Django REST 框架 API 中对 MongoDB 中的电影数据进行建模。

1

运行以下命令以安装具有 rest_framework 依赖项的 Django MongoDB 扩展:

pip install "django-mongodb-extensions[rest_framework]"
2

导航到项目的 settings.py 文件。然后,将 "django_mongodb_extensions""rest_framework" 添加到 INSTALLED_APPS 设置中,如下示例所示:

INSTALLED_APPS = [
'django_mongodb_extensions',
'rest_framework',
# ... your other apps
]
3

在“开始使用”教程中,您创建了一个包含以下代码的 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 文件。

4

要序列化使用 ObjectIdAutoField 的模型,请在 serializers.py 文件中定义一个扩展 MongoModelSerializer 的序列化器。以下示例为 Viewer 模型定义了一个序列化器:

serializers.py
from django_mongodb_extensions.rest_framework import MongoModelSerializer
from .models import Viewer
class ViewerSerializer(MongoModelSerializer):
class Meta:
model = Viewer
fields = "__all__"
5

要序列化存储嵌入模型的字段,请为嵌入模型定义扩展 EmbeddedModelSerializer 的序列化程序,然后从父模型的序列化程序中引用它。

要将 Movie 模型及其嵌入的 Award 模型序列化,请更新 serializers.py 文件以使其与下文类似:

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__"

注意

嵌入式模型序列化程序行为

序列化嵌入模型时,请注意以下行为:

  • EmbeddedModelSerializer 排除主键字段,除非您在 Meta.fields 中明确列出这些字段。

  • to_internal_value() 方法返回模型实例而非字典。

  • 您无法直接保存嵌入模型。请通过其父模型保存它们。

6

定义序列化器后,可以使用它将模型实例转换为原始数据类型字典,Django REST 框架可以将其渲染为 JSON。

通过运行以下命令来启动Python Shell :

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'}
7

当序列化包含嵌入模型的模型时,序列化器会在输出中嵌套嵌入模型的字段。

在 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 应用程序,它使用 Django MongoDB Extensions 序列化程序在 Django REST Framework API 中表示 MongoDB 电影相关字段。

要学习有关 Django REST 框架 的更多信息,请参阅 Django REST 框架 文档。

要了解有关 Django MongoDB Extensions 包的更多信息,请参阅 PyPI 上的 django-mongodb-extensions 和 GitHub 上的 django-mongodb-extensions 存储库。