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

Kap*_*h M 3 python django json python-3.x django-rest-framework

Django serializersvs 和有什么不一样rest_framework serializers?我制作了一个 webapp,我希望 API 成为项目创建的主要应用程序的一部分。不为 API 功能创建单独的应用程序。我需要为 Django 视图和模型使用哪个序列化程序,同时适用于 API?

from django.core import serializers
Run Code Online (Sandbox Code Playgroud)

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

from rest_framework import serializers
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*sco 6

tl;博士

如果你想创建只是几个非常小的API端点和希望使用DRF,你最好还是手动构建的字典。Django 核心序列化程序不适用于外部消费者。


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

差异详解

假设您有以下模型

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)
Run Code Online (Sandbox Code Playgroud)

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

{
  "first_name": "Jon",
  "last_name": "Skeet"
}
Run Code Online (Sandbox Code Playgroud)

使用 Django 序列化程序

{
  "first_name": "Jon",
  "last_name": "Skeet"
}
Run Code Online (Sandbox Code Playgroud)

你得到的结果将是形式的字典列表

{
      "fields" : {
         "first_name" : "Jon",
         "last_name" : "Skeet"
      },
      "model" : "employees.Employee",
      "pk" : 12
}
Run Code Online (Sandbox Code Playgroud)

但这不是我们要找的。Django 核心序列化器旨在将模型序列化为数据库中内容的表示。该命令使用它这一事实表明dumpdata这一点

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)
Run Code Online (Sandbox Code Playgroud)
[
  {
      "fields" : {
         "identification_number" : "20201293",
         "first_name" : "Jon",
         "last_name" : "Skeet"
      },
      "model" : "employees.Employee",
      "pk" : 12
  }
]
Run Code Online (Sandbox Code Playgroud)

现在,当然你可以对你的代码做一些事情来获得你想要的表示,但是这个模块并不打算用于 API 视图供外部消费者使用


使用 Django REST 框架

在这里我们可以创建独立于模型的序列化器类。这很重要,因为对象的外部表示与内部表示保持分离。

{
      "fields" : {
         "first_name" : "Jon",
         "last_name" : "Skeet"
      },
      "model" : "employees.Employee",
      "pk" : 12
}
Run Code Online (Sandbox Code Playgroud)

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

python manage.py dumpdata employees.Employee | json_pp
Run Code Online (Sandbox Code Playgroud)

并导致我们正在寻找的表示。

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

[
  {
      "fields" : {
         "identification_number" : "20201293",
         "first_name" : "Jon",
         "last_name" : "Skeet"
      },
      "model" : "employees.Employee",
      "pk" : 12
  }
]
Run Code Online (Sandbox Code Playgroud)

它负责处理所有样板文件,因此非常方便,并且与 Django 核心序列化程序相比,这确实适用于外部消费者。