Django序列化器 vs rest_framework序列化器

6
什么是Django序列化器与rest_framework序列化器之间的区别? 我正在制作一个Web应用程序,希望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个回答

10

简而言之

如果你只想创建一些非常小的API端点,而且不想使用DRF, 手动构建字典会更好。Django核心序列化器不适用于外部用户。


你可以在项目中使用相同的主应用程序,并使其与DRF并行工作。只需添加一个带有定义的serializers.py文件,将DRF逻辑添加到同一个views.py文件中并进行路由。你可以使用基于函数的视图

差异的详细解释

假设您拥有以下模型。
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核心序列化程序旨在将模型序列化为数据库中的表示。这一点通过dumpdata命令使用它来明确表达。
python manage.py dumpdata employees.Employee | json_pp

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

当然,你可以对代码进行一些修改,以获得所需的表示方式,但此模块不适用于供外部使用者消费的API视图


使用Django REST框架

在这里,我们可以创建与模型无关的序列化器类。这一点很重要,因为对象的外部表示与内部表示是分开的。

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核心序列化器相比,这确实是为外部消费者而设计的。

感谢您为详细的答案所付出的努力。 - Majoris

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接