Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django序列化程序与rest_框架序列化程序_Python_Json_Django_Python 3.x_Django Rest Framework - Fatal编程技术网

Python Django序列化程序与rest_框架序列化程序

Python Django序列化程序与rest_框架序列化程序,python,json,django,python-3.x,django-rest-framework,Python,Json,Django,Python 3.x,Django Rest Framework,Django序列化程序与rest\u框架序列化程序之间有什么区别? 我正在制作一个webapp,我希望API成为项目创建的主应用程序的一部分。不为API功能创建单独的应用程序。对于Django视图和模型,我需要使用哪个序列化程序,同时它也可以用于API from django.core import serializers 这是一种默认与高级的情况。Django序列化只有一页文档,而Django Rest有一个完整的网站。如果您的应用程序使用了大量API,那么安装整个框架是有意义的。但是对于

Django序列化程序
rest\u框架序列化程序
之间有什么区别? 我正在制作一个webapp,我希望API成为项目创建的主应用程序的一部分。不为API功能创建单独的应用程序。对于Django视图和模型,我需要使用哪个序列化程序,同时它也可以用于API

from django.core import serializers


这是一种默认与高级的情况。Django序列化只有一页文档,而Django Rest有一个完整的网站。如果您的应用程序使用了大量API,那么安装整个框架是有意义的。但是对于较小的API,您只需要使用默认的Django API。不需要同时使用两者。另外,在视图中使用序列化程序。

tl;博士 如果您只想创建几个非常小的API端点,而不想使用DRF。Django core序列化程序不适用于外部使用者。


您可以在项目中使用相同的主应用程序,并使其与DRF并行工作。只需添加一个带有定义的
serializers.py
文件,在相同的
views.py
文件中添加DRF逻辑,然后进行路由。你可以用

差异的详细解释 假设您有以下模型

class员工(models.Model):
标识号=型号.CharField(最大长度=12)
first_name=models.CharField(最大长度=50)
last_name=models.CharField(最大长度=50)
您希望创建一个端点
/employees/
,该端点返回所有具有JSON表示的此类对象

{
  "first_name": "Jon",
  "last_name": "Skeet"
}

使用Django序列化程序 来自django.core导入序列化程序的

从django.http导入HttpResponse
类EmployeeView(视图):
def get(自我,请求):
employees=Employee.objects.all()
serialized=序列化程序。序列化(
“json”,
员工,
字段=('first_name'、'last_name'),
)
返回HttpResponse(序列化)
你得到的结果是一个字典列表

{
      "fields" : {
         "first_name" : "Jon",
         "last_name" : "Skeet"
      },
      "model" : "employees.Employee",
      "pk" : 12
}
但这不是我们要找的。Django核心序列化程序的目的是。这一点通过以下事实得以明确

python manage.py dumpdata employees.Employee | json_pp
现在,当然您可以对代码做一些事情来获得所需的表示,但是此模块不用于外部使用者使用的API视图


使用Django REST框架 在这里,我们可以创建独立于模型的序列化程序类。这一点很重要,因为对象的外部表示与内部表示是分开的

class EmployeeSerializer(serializers.ModelSerializer):
类元:
模型=员工
字段=(
“名字”,
“姓”,
)
并且,尝试只使用DRF最基本的序列化-反序列化功能,我们会得到

从rest\u framework.renders导入JSONRenderer
从django.http导入HttpResponse
类EmployeeView(视图):
def get(自我,请求):
employees=Employee.objects.all()
serialized=EmployeeSerializer(employees,many=True)
json_representation=JSONRenderer().render(序列化的.data)
返回HttpResponse(json_表示)
结果就是我们要找的代表

当然,您通常不会像上一个示例中那样使用DRF,而是

从rest\u框架导入视图集
类EmployeeViewSet(viewsets.ReadOnlyModelViewSet):
queryset=Employee.objects.all()
serializer\u class=EmployeeSerializer

它处理了所有的样板文件,因此非常方便,与Django core序列化程序相比,这是为外部消费者准备的。

感谢您的详细回答。
{
      "fields" : {
         "first_name" : "Jon",
         "last_name" : "Skeet"
      },
      "model" : "employees.Employee",
      "pk" : 12
}
[
  {
      "fields" : {
         "identification_number" : "20201293",
         "first_name" : "Jon",
         "last_name" : "Skeet"
      },
      "model" : "employees.Employee",
      "pk" : 12
  }
]