Django 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/
答案 0 :(得分:6)
如果您只想创建很少的 个非常小的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"
}
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 database。 the 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视图。< / p>
在这里,我们可以创建独立于Model的序列化程序类。这很重要,因为对象的外部表示与内部表示是分开的。
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核心序列化程序相比,这确实是给外部使用者的。
答案 1 :(得分:0)
这是默认还是高级情况。 Django序列化只有一页文档,而Django Rest有一个完整的网站。如果您的应用程序使用大量API,则安装整个框架是有意义的。但是对于较小的API,您只需使用默认的Django即可。无需同时使用两者。另外,在视图中使用序列化器。