【问题标题】:Django serializers vs rest_framework serializersDjango 序列化器与 rest_framework 序列化器
【发布时间】:2020-07-09 13:44:06
【问题描述】:

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/

【问题讨论】:

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


    【解决方案1】:

    tl;博士

    如果您只想创建几个非常小的 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 视图


    使用 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,而是使用 DRF

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

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

    【讨论】:

    • 感谢您的详细解答。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-30
      • 2018-03-01
      • 1970-01-01
      • 2018-01-30
      • 2021-01-20
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多