如何使用 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 解决您的问题并忽略序列化程序。
你需要修改你的答案,如果你没有使用model
,serializers.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 中序列化一对多关系?
如何使用 django-rest-framework 中的序列化器将相似数据合并到自定义字段中?
如何在 django rest 框架中的嵌套序列化器相关对象上使用 prefetch_related?