简而言之
如果你只想创建一些非常小的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核心序列化器相比,这确实是为外部消费者而设计的。