gpt4 book ai didi

python - Django 序列化器与 rest_framework 序列化器

转载 作者:行者123 更新时间:2023-12-04 00:20:43 27 4
gpt4 key购买 nike

Django serializers 和有什么区别对比 rest_framework serializers ?
我制作了一个 webapp,我希望 API 成为项目创建的主要应用程序的一部分。不为 API 功能创建单独的应用程序。我需要为 Django View 和模型使用哪个序列化程序,同时对 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/

最佳答案

tl;博士
如果您只想创建一些非常小的 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"
}

使用 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 核心序列化程序旨在 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 View .

使用 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 核心序列化程序相比,这确实适用于外部消费者。

关于python - Django 序列化器与 rest_framework 序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60909380/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com