Django序列化程序与rest_framework序列化程序

时间:2020-03-29 02:11:54

标签: python json django python-3.x django-rest-framework

Django serializersrest_framework serializers有什么区别? 我制作了一个Webapp,我希望API成为该项目创建的主要应用程序的一部分。没有为API功能创建单独的应用程序。我需要为Django视图和模型使用哪个序列化程序,并且同时适用于API?

from django.core import serializers

https://docs.djangoproject.com/en/3.0/topics/serialization/

from rest_framework import serializers

https://www.django-rest-framework.org/api-guide/serializers/

2 个答案:

答案 0 :(得分:6)

tl; dr

如果您只想创建很少的 个非常小的API端点,而不想则想使用DRF,请you're better off manually building the dictionaries。 Django核心序列化程序不适用于外部使用者。


您可以在项目中使用相同的主应用程序,并使其与DRF并行工作。只需添加带有定义的serializers.py文件,在同一views.py文件中添加DRF逻辑并进行路由即可。您可以使用function based views

差异的详细说明

假设您使用以下模型

class Employee(models.Model):
  identification_number = models.CharField(max_length=12)
  first_name = models.CharField(max_length=50)
  last_name = models.CharField(max_length=50)

您想创建一个端点/employees/,该端点返回所有具有JSON表示形式的此类对象

{
  "first_name": "Jon",
  "last_name": "Skeet"
}

使用Django序列化程序

from django.core import serializers
from django.http import HttpResponse

class EmployeeView(View):
    def get(self, request):
        employees = Employee.objects.all()
        serialized = serializers.serialize(
          'json',
          employees,
          fields=('first_name', 'last_name'),
        )
        return HttpResponse(serialized)

,您得到的结果将是以下形式的字典的列表

{
      "fields" : {
         "first_name" : "Jon",
         "last_name" : "Skeet"
      },
      "model" : "employees.Employee",
      "pk" : 12
}

但这不是我们想要的。 Django核心序列化程序用于serialize models as representations of what's in the databasethe dumpdata command uses it这一事实使之明确。

python manage.py dumpdata employees.Employee | json_pp
[
  {
      "fields" : {
         "identification_number" : "20201293",
         "first_name" : "Jon",
         "last_name" : "Skeet"
      },
      "model" : "employees.Employee",
      "pk" : 12
  }
]

现在,您当然可以对代码执行一些操作来获取所需的表示形式,但是该模块并非旨在供外部使用者使用的API视图。< / p>


使用Django REST框架

在这里,我们可以创建独立于Model的序列化程序类。这很重要,因为对象的外部表示与内部表示是分开的。

class EmployeeSerializer(serializers.ModelSerializer):

  class Meta:
    model = Employee
    fields = (
      'first_name',
      'last_name',
    )

,并且尝试仅使用DRF的最基本的序列化/反序列化功能,我们会得到

from rest_framework.renderers import JSONRenderer
from django.http import HttpResponse

class EmployeeView(View):
    def get(self, request):
        employees = Employee.objects.all()
        serialized = EmployeeSerializer(employees, many=True)
        json_representation = JSONRenderer().render(serialized.data)
        return HttpResponse(json_representation)

并得到我们想要的表示形式。

现在,您当然通常不像上一个示例那样使用DRF,而是

from rest_framework import viewsets

class EmployeeViewSet(viewsets.ReadOnlyModelViewSet):
  queryset = Employee.objects.all()
  serializer_class = EmployeeSerializer

它可以处理所有样板文件,因此非常方便,并且与Django核心序列化程序相比,这确实是给外部使用者的。

答案 1 :(得分:0)

这是默认还是高级情况。 Django序列化只有一页文档,而Django Rest有一个完整的网站。如果您的应用程序使用大量API,则安装整个框架是有意义的。但是对于较小的API,您只需使用默认的Django即可。无需同时使用两者。另外,在视图中使用序列化器。

相关问题