Django Rest Frame work 如何使用serializers序列化函数新手教程
Django Rest Framework提供了serializers模块,用于序列化和反序列化模型实例以及 原生数据类型。下面是一个使用serializers模块的简单示例:
首先,我们需要导入serializers模块和要序列化的模型类:
from rest_framework import serializers from myapp.models import MyModel
接下来,我们定义一个serializers类,将要序列化的模型类传递给Meta类的model属性:
class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel fields = ('id', 'name', 'description')
在这个示例中,我们只序列化模型类的三个字段:id、name和description。你可以根据你的需求选择序列化哪些字段。
在序列化数据时,我们可以使用MyModelSerializer类的实例,并将要序列化的模型实例传递给它的构造函数。例如,假设我们有一个名为mymodel的MyModel实例:
mymodel = MyModel.objects.get(id=1) serializer = MyModelSerializer(mymodel)
我们可以访问serializer的数据属性来获取序列化后的数据:
print(serializer.data)
最后,如果我们需要反序列化请求数据并创建一个新的模型实例,我们可以在MyModelSerializer中定义create()方法和update()方法。这些方法用于从反序列化的数据中创建或更新模型实例。例如,如果我们想要创建一个新的MyModel实例,我们可以这样做:
class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel fields = ('id', 'name', 'description') def create(self, validated_data): return MyModel.objects.create(**validated_data)
在上面的例子中,create()方法从validated_data字典中创建一个新的MyModel实例并返回它。
在Django Rest Framework中,使用APIView类创建API视图。这个类提供了处理HTTP请求的方法(例如GET、POST、PUT、DELETE等)并且可以自动生成API文档。
要查看自动生成的API接口,可以使用Django Rest Framework的Browsable API功能。Browsable API提供了一个交互式的API浏览器,可以轻松地查看API端点以及它们所支持的请求方法和参数。
首先,确保你已经安装了Django Rest Framework并启用了Browsable API。你可以在你的settings.py文件中添加以下设置来启用Browsable API:
INSTALLED_APPS = [ # ... 其他应用程序... 'rest_framework', ] REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer', ] }
接下来,在你的APIView视图中添加一个URL模式,并确保使用的是rest_framework.urlpatterns模块:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from rest_framework.decorators import api_view from rest_framework import serializers class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel fields = ('id', 'name', 'description') class MyModelView(APIView): def get(self, request, format=None): mymodels = MyModel.objects.all() serializer = MyModelSerializer(mymodels, many=True) return Response(serializer.data) def post(self, request, format=None): serializer = MyModelSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) from rest_framework.urlpatterns import format_suffix_patterns from django.urls import path urlpatterns = format_suffix_patterns([ path('mymodels/', MyModelView.as_view(), name='mymodel-list'), ])
现在启动Django开发服务器并访问浏览器。在浏览器中,转到http://localhost:8000/mymodels/。您应该会看到Browsable API界面,其中包含有关API端点的信息和允许您测试端点的表单。在Browsable API中,您可以轻松地查看自动生成的API文档和测试您的API视图。
在前端使用Django Rest Framework API接口,可以使用各种库和框架来执行HTTP请求并处理响应数据。以下是一些常用的库和框架:
- jQuery: 一个广泛使用的JavaScript库,它提供了执行Ajax请求的简单API。
$.ajax({ url: '/api/mymodels/', dataType: 'json', success: function(data) { console.log(data); } });
- Axios: 一个基于Promise的JavaScript HTTP客户端,可以在浏览器和Node.js中使用。
axios.get('/api/mymodels/') .then(function (response) { console.log(response.data); }) .catch(function (error) { console.log(error); });
- Fetch API: 一种现代的JavaScript API,用于执行HTTP请求并处理响应数据。
fetch('/api/mymodels/') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error(error));
无论你选择哪个库或框架,你需要确保正确处理响应数据。一般来说,Django Rest Framework返回的响应数据是JSON格式的,你需要使用库的JSON解析器将数据解析为JavaScript对象。然后,你可以使用JavaScript来处理这些数据并更新你的应用程序界面。
注意,如果你的Django Rest Framework API需要身份验证或授权,你需要在前端请求中包含有效的身份验证凭据或令牌。这通常涉及将令牌添加到请求标头或使用cookie。在使用身份验证和授权时,请注意保护你的应用程序免受潜在攻击。
如果你想在Django Rest Framework中重写自动生成的API,你可以使用APIView或其子类创建自定义视图。APIView类提供了处理HTTP请求的方法,例如GET、POST、PUT和DELETE,以及处理异常、身份验证和授权的方法。你可以在自定义视图中使用Django ORM或其他数据访问库来检索或更新数据,并使用序列化程序将数据转换为JSON或其他格式。
以下是一个使用APIView创建自定义视图的示例:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .models import MyModel from .serializers import MyModelSerializer class MyModelList(APIView): def get(self, request): mymodels = MyModel.objects.all() serializer = MyModelSerializer(mymodels, many=True) return Response(serializer.data) def post(self, request): serializer = MyModelSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
在这个例子中,我们创建了一个名为MyModelList的视图类,并实现了GET和POST方法来处理HTTP GET和POST请求。在GET方法中,我们检索所有的MyModel对象并将它们序列化为JSON格式。在POST方法中,我们使用MyModelSerializer将请求数据反序列化为MyModel对象,并将其保存到数据库中。
然后,我们需要将视图类绑定到URL模式,以便Django Rest Framework可以将请求路由到正确的视图。在这个例子中,我们可以将以下URL模式添加到我们的urls.py文件中:
from django.urls import path from .views import MyModelList urlpatterns = [ path('mymodels/', MyModelList.as_view(), name='mymodel-list'), ]
在这个URL模式中,我们将'/mymodels/'路径映射到MyModelList视图。现在,我们可以访问我们的自定义视图,而不是使用Django Rest Framework自动生成的视图。
如果你想在Django Rest Framework自动生成的API中添加新的功能,你可以通过扩展自动生成的视图来实现。Django Rest Framework自动生成的视图类提供了大量的可扩展性,包括添加新的HTTP方法、自定义查询集、添加额外的字段等。
以下是一些常见的扩展自动生成的视图的示例:
- 添加新的HTTP方法:
from rest_framework import generics class MyModelList(generics.ListCreateAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer def put(self, request, *args, **kwargs): # 实现PUT方法的逻辑 return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): # 实现DELETE方法的逻辑 return self.destroy(request, *args, **kwargs)
在这个例子中,我们扩展了ListCreateAPIView视图,为它添加了PUT和DELETE方法。在这些方法中,我们实现了自己的PUT和DELETE逻辑,并调用父类的update()和destroy()方法来执行更新和删除操作。
- 自定义查询集:
class MyModelList(generics.ListCreateAPIView): serializer_class = MyModelSerializer def get_queryset(self): # 添加自定义查询集逻辑 return MyModel.objects.filter(owner=self.request.user)
在这个例子中,我们重写了get_queryset()方法来自定义查询集。我们可以使用self.request对象来访问当前请求,并使用它来过滤查询集。在这个例子中,我们只返回当前用户拥有的MyModel对象。
- 添加额外的字段:
class MyModelSerializer(serializers.ModelSerializer): extra_field = serializers.SerializerMethodField() class Meta: model = MyModel fields = '__all__' def get_extra_field(self, obj): # 添加额外字段的逻辑 return "Extra Value"
在这个例子中,我们扩展了MyModelSerializer序列化程序,为它添加了一个额外的字段。我们使用SerializerMethodField字段来创建额外的字段,并实现get_extra_field()方法来返回字段的值。在这个例子中,我们返回了一个字符串"Extra Value"作为额外字段的值。
通过扩展自动生成的视图和序列化程序,你可以为Django Rest Framework自动生成的API添加新的功能。这些扩展功能可以帮助你更好地满足你的业务需求,并提供更好的用户体验。
Django Rest Frame work 如何使用serializers序列化函数新手教程的更多相关文章
- [python]django的mode设置表结构和serializers序列化数据
框架使用的库版本 python3.6.5 Django-2.0.6 djangorestframework-3.8.2 mysqlclient-1.3.12 1.项目结构声明,数据库在setting. ...
- Serializers 序列化组件
Serializers 序列化组件 为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转 ...
- Django组件补充(缓存,信号,序列化)
Django组件补充(缓存,信号,序列化) Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑 ...
- Django-Rest-Framework的序列化之serializers 序列化组件
Django-Rest-Framework的序列化之serializers 序列化组件 restful framework 正常的序列化 from django.http import HttpRes ...
- Django框架深入了解_02(DRF之序列化、反序列化)
序列化:将Python对象准换成json格式的字符串,反之即为反序列化 DRF的序列化使用过程: 使用drf的序列化组件 -1 新建一个序列化类继承Serializer -2 在类中写要序列化的字段 ...
- PHP serialize() 序列化函数
PHP serialize() 序列化函数 定义和用法 — 语法 string serialize ( mixed $value ) serialize() 返回字符串,此字符串包含了表示 value ...
- js进阶 14-8 表单序列化函数serializeArray()和serialize()的区别是什么
js进阶 14-8 表单序列化函数serializeArray()和serialize()的区别是什么 一.总结 一句话总结:两者都是对表单进行序列化,serializeArray()返回的是json ...
- django rest framework serializers序列化
serializers是将复杂的数据结构变成json或者xml这个格式的 serializers有以下几个作用: - 将queryset与model实例等进行序列化,转化成json格式,返回给用户(a ...
- django rest_framework Serializers 序列化组件
为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿 ...
- Django Rest Framework源码剖析(六)-----序列化(serializers)
一.简介 django rest framework 中的序列化组件,可以说是其核心组件,也是我们平时使用最多的组件,它不仅仅有序列化功能,更提供了数据验证的功能(与django中的form类似). ...
随机推荐
- [C#]为debug添加DebuggerDisplay属性
最近才发现,DebuggerDisplay 非常弓虽大,给类添加DebuggerDisplay属性后可以让调试变得更简单.如何使用? 1.定义一个有DebuggerDisplay的类:在类的头部添加& ...
- Java后台校验手机号和邮箱
//true是手机号,false不是手机号 public static boolean checkPhone(String phone){ Pattern p = Pattern.compile(&q ...
- Python elasticsearch 使用心得
一.配置 python == 3.6/3.8 # 更高版本的elasticsearch会出现doc_type被统一成_doc导致旧版语句报错的情况 pip install elasticsearch= ...
- WebForm发布IIS后,报错无谓词错误
需要在Config文件中添加默认页面 <system.webServer> <defaultDocument> <files> <add value=&quo ...
- SAP MD04屏幕显示增强
需求 在看物料MRP结果的时候,业务人员想要看到工单批次,工单批次是我们这边工单下达后传输到其他系统,然后由其他系统回传回来的. 开发步骤 主要使用二代增强出口:M61X0002 创建增强项目 事务码 ...
- k8s ingress 报错整理
问题: Error from server (InternalError): error when creating "ingress-rules-demo1.yaml": Int ...
- finalshell如何查看密码
1.右键点击导出 2.打开导出的配置文件,搜索password,找到password的编码后的字符串复制 3.运行下面代码,即可查看原来的密码,把main()方法的字符串替换成上一步复制的字符串imp ...
- Iperf参数详解
IperfIperf是一个网络性能测试工具,可以测试TCP和UDP最大带宽,具有多种参数和UDP特性,可以根据需要调整,报告带宽,延迟,数据包丢失 通用参数-b(bandwidth):指定UDP模式使 ...
- pycharm安装appium,通过国内的镜像源安装python包,注意每次都要添加信任选项 --trusted-host mirrors.aliyun.com
1.更改阿里源 或者清华源 1.file - - settings - - project - - project interpreter - - 右侧+ - - manage rep ...
- C# 教你如何终止Task线程
我们在多线程中通常使用一个bool IsExit类似的代码来控制是否线程的运行与终止,其实使用CancellationTokenSource来进行控制更为好用,下面我们将介绍CancellationT ...