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