在序列化过程中,我正在学习JSONParsers.Below,在这个过程中,我陷入了JSONRenderers,其中提到的代码是:
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from django.utils.six import BytesIO
snippet = Snippet(code='foo = "bar"\n')
snippet.save()
snippet = Snippet(code='print "hello, world"\n')
snippet.save()
serializer = SnippetSerializer(snippet)
serializer.data
# {'pk': 2, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False, 'language': u'python', 'style': u'friendly'}
content = JSONRenderer().render(serializer.data)
content
# '{"pk": 2, "title": "", "code": "print \\"hello, world\\"\\n", "linenos": false, "language": "python", "style": "friendly"}'
stream = BytesIO(content)
data = JSONParser().parse(stream)我知道JSONParser用于反序列化数据,JSONRenderer用于序列化数据,但对于数据序列化和反序列化之间的区别,我仍然没有很好的理解。有人能给我一个清晰的理解吗?(用一个例子回答是非常感谢的。)
还有JSONRenderer和JSONParser是如何工作的?
发布于 2016-02-27 16:45:18
我将从视图集开始。视图和视图集是DRF中的类,大多数应用程序逻辑都发生在DRF中。
例如:ModelViewSet类负责CRUD操作,以响应POST、PUT、修补、GET、DELETE HTTP方法。
让我们看看来自框架/混合器的默认创建方法--这个方法创建模型的实例,从通过HTTP方法发送的数据(如果它们是有效的)发送,并将它们保存到数据库中。
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer):
serializer.save()这就是这里发生的事。
self.get_serializer()创建序列化程序的新实例(您在前面设置序列化器类),它使用request.data作为参数。request.data是(这是重要的)字典。字典是泛型python数据结构。
serializer.is_valid()方法检查request.data是否有效。如果是,您可以访问serializer.data -,也可以访问字典。
serializer.save()方法创建模型的实际实例(片段)并将其保存到数据库。您可以像这样直接访问实例
instance = serializer.save()然后将使用serializer.data填充的响应对象返回给客户端。
如您所见,视图集中没有--没有表单数据、JSON、XML、HTML等。您可以使用python数据类型,序列化程序可以将字典“转换”到特定模型的实例并向后转换。但是客户端以JSON的形式以HTTP请求的形式发送数据(在您的例子中)。
JSONParser负责将JSON转换为字典。解析是在请求类框架/请求.中实现的,请注意,这不是标准的django HttpRequest模型。
您可以设置多个解析器,然后请求将根据HTTP请求头选择合适的解析器:Content。
第二件事是,您必须以JSON的形式将serializer.data返回给客户端,而不是字典。这就是JSONRenderer所做的。它将dict转换为JSON并在响应类框架/Resse.py中实现。另外,您还可以设置多个呈现器,然后根据已接受的媒体类型http标头选择合适的呈现器。
完整视图集定义的示例可能是:
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
class SnippetViewSet(viewsets.ModelViewSet):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
renderer_classes = (JSONRenderer, )
parser_classes = (JSONParser,)https://stackoverflow.com/questions/35669322
复制相似问题