[英]Django serializers vs rest_framework serializers
Django serializers
与rest_framework serializers
什么rest_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/
如果你想创建只有几个很小的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)
并且您想创建一个端点/employees/
以 JSON 表示返回所有此类对象
{
"first_name": "Jon",
"last_name": "Skeet"
}
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 视图供外部消费者使用。
在这里我们可以创建独立于模型的序列化器类。 这很重要,因为对象的外部表示与内部表示保持分离。
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 核心序列化程序相比,这确实适用于外部消费者。
这是默认与高级的情况。 Django 序列化只有一页文档,而 Django Rest 有一个完整的网站。 如果您的应用程序使用大量 API,那么安装整个框架是有意义的。 但是对于较小的 API,您只需使用默认的 Django 即可。 无需同时使用两者。 此外,在视图中使用序列化程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.