如何使用 Django REST 序列化器?

Posted

技术标签:

【中文标题】如何使用 Django REST 序列化器?【英文标题】:How to use Django REST Serializers? 【发布时间】:2015-09-28 11:32:01 【问题描述】:

所以,在阅读了 Django REST Framework 文档和一堆教程之后,我仍然无法理解如何使用 Django 序列化程序将传入的 POST (JSON) 数据转换为 Python 对象(对不起,我是新手)。

鉴于我将一个 JSON 字符串发布到 api/foo/bar,我该如何编写它的序列化程序?

示例 JSON:

 'name': 'Mr. Foo', address:'Bar Street' 

我的控制器 Foo 包含一个 bar 方法如下:

@detail_route(
    methods=['post']
)
def bar(self, request, uuid=None):
    serializer = MySampleSerializer(data=request.DATA)

    something.clone(serializer.object)
    return Response(status=status.HTTP_201_CREATED)

有人可以向我解释一下我的序列化器应该是什么样子吗?以及如何从序列化程序访问序列化数据?

【问题讨论】:

你确定你已经阅读了整个教程吗?我也是新手,但我发现它写得非常好并且非常有用:它让我可以立即将 json-web-api 添加到我的应用程序中。具体来说,有什么理由不使用 CBV? (例如模型视图集) 你有没有制作任何 Django 模型,比如教程中的Snippet? django-rest-framework.org/tutorial/1-serialization 就像@Pynchia 说的;该教程写得很好,如果您完全按照它进行操作,应该不会有什么困惑。 我读过 - 但是我希望能够在没有模型的情况下使用数据。 看这里,***.com/questions/13603027/… 【参考方案1】:

基本上,您将 JSON 数据传递给序列化程序,然后访问将返回有序字典的数据字段。

def bar(self, request, uuid=None):
    serializer = MySampleSerializer(data=request.data)
    if serializer.is_valid(raise_exception=True):
        my_object = serializer.data # Grab the dict of values

定义一个序列化器:

class MySampleSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=30)
    address = serializers.CharField(max_length=30)

【讨论】:

好答案。但请参阅上面 OP 最近的评论:“我希望能够在没有模型的情况下使用数据。” 感谢您的简洁回答!但是,是的,正如 Pynchia 所说:我希望能够在没有模型的情况下使用它。 您无法从序列化程序中获取原始 python 对象。传入数据后,您可以访问 serializer.data 并接收字典。如果你想要一个 python 对象,那么可以实现一个基于 json 表示创建 python 对象的自定义 create 方法。 好的,谢谢。但是问题仍然存在:如何在没有模型的情况下将 JSON 字段与我的序列化程序关联?【参考方案2】:

由于您不想使用模型,因此您必须从头开始创建序列化程序。像这样的东西应该可以工作:

class MySerializer(serializers.Serializer):
    name = serializers.CharField(max_length = 100)
    adress = serializers.CharField(max_length = 100)

然后你可以在这样的请求中使用它:

def bar(self, request, uuid=None):
    data = JSONParser().parse(request)
    serializer = MySerializer(data = data)
    return Response(status=status.HTTP_201_CREATED)

但是请注意,由于您尚未创建 Django 模型,因此您将无法保存序列化数据(因此不会在数据库中保存任何内容)

【讨论】:

谢谢!!还有一个问题:一旦我有了序列化器对象,我如何访问这些字段? serializer.data.get() ? 我确实建议您将序列化程序与 Django 模型对象结合使用,但是您可以通过 name = serializer.data["name"] 访问数据 您可能希望使用序列化程序进行验证。因此,检查数据是否有效后,通过serializer.validated_data访问。否则,您可能只是使用 JSONparser 解决您的问题并忽略序列化程序。 你需要修改你的答案,如果你没有使用modelserializers.ModelSerializer应该是serializers.Serializer @Incognos 我的错!已更新。【参考方案3】:

您不必使用 ModelSerializer:

from rest_framework import serializers

class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()

和访问:

serializer = CommentSerializer(data=data)
serializer.is_valid()
# True
serializer.validated_data

顺便说一句,以上所有内容均来自 DRF website

【讨论】:

您的回答具有误导性,因为该问题专门针对通过 POST 接收数据(即反序列化)。 它是如何误导的?我在问题中清楚地阅读了how do I write its serializer?...他提到不使用模型...他可以很容易地从文档中得到大部分答案 你答案的后半部分。您正在展示如何序列化。您应该展示如何反序列化(和验证) 而不是发表评论,你投反对票?这就是你反序列化的方式 对不起,伙计,仍在与 SO 的约束作斗争。如果您编辑它,我很乐意更改它。

以上是关于如何使用 Django REST 序列化器?的主要内容,如果未能解决你的问题,请参考以下文章

Django REST API:使特定权限级别的字段只读

如何使用模型序列化器在 django-rest 中序列化一对多关系?

如何使用 django-rest-framework 中的序列化器将相似数据合并到自定义字段中?

如何在 django rest 框架中的嵌套序列化器相关对象上使用 prefetch_related?

如何在 Django Rest Framework 中过滤嵌套的序列化程序?

如何使 rest_framework 序列化器禁止多余的字段?