Django сериализаторы против сериализаторов rest_framework - PullRequest
1 голос
/ 29 марта 2020

В чем разница между Django serializers против rest_framework serializers? Я сделал веб-приложение, в котором я хочу, чтобы 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 ]

1 голос
/ 29 марта 2020

tl; dr

Если вы хотите создать только несколько очень маленьких конечных точек API и не хотите использовать DRF, Вам лучше вручную строить словари . Сериализаторы ядра Django не предназначены для внешних потребителей.


Вы можете использовать одно и то же основное приложение в своем проекте и заставить его работать с DRF параллельно. Просто добавьте файл serializers.py с определениями, добавьте логи DRF c в тот же файл 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 framework

Здесь мы можем создать классы сериализатора, которые не зависят от модели. Это важно, поскольку внешнее представление объекта хранится отдельно от внутреннего.

class EmployeeSerializer(serializers.ModelSerializer):

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

и, пытаясь использовать только самые основные c возможности сериализации-десериализации 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, он действительно предназначен для внешних потребителей.

0 голосов
/ 29 марта 2020

Это стандартная ситуация против сложной. У Django serialize есть только одна страница документации, а у Django Rest есть целый веб-сайт. Если ваше приложение использует много API, то имеет смысл установить целую среду. Но для меньших API вы бы просто использовали стандартный Django. Нет необходимости использовать оба одновременно. Также используйте сериализаторы в представлениях.

...