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类似). ...
随机推荐
- MySQL Replication(数据同步技术)
MySQL Replication(数据同步技术) A 到 B 完成主从复制,意思是数据同步技术 从读取主的二进制日志文件,按照日志中记录对从库进行同样的操 ...
- 华为S6720S-S24S28X-A配置参数
- liunx安装docker (自我记录)
1 安装 安装所需的软件包dnf install -y yum-utils device-mapper-persistent-data lvm2 //官方源地址(比较慢) ~]# dnf config ...
- 图 -拓扑 topo
https://www.cnblogs.com/New-ljx/p/13874648.html 在有向无环图上,用拓扑排序在O(n)的时间内求出最短/长路,是一个不错的选择(也称拓扑的DP). 只需要 ...
- 1055. Combinations
1055. Combinations Time limit: 1.0 secondMemory limit: 64 MB As you have known MMM corporation lab r ...
- 225-基于XCVU440T的多核处理器多输入芯片验证板卡
225-基于XCVU440T的多核处理器多输入芯片验证板卡 基于XCVU440T的多核处理器多输入芯片验证板卡 一.板卡概述 本板卡系我司自主研发的基于6U CPCI处理板,适用于多核处理器多输入 ...
- Traefik官方文档以及翻译文档
https://www.qikqiak.com/traefik-book/ https://doc.traefik.io/traefik/
- Software_programming_tools_IDEA
13:45:55 key promtoer 快捷键提示插件
- arm架构安装mysql5.7
添加mysql用户组和mysql用户,用于隔离mysql进程 groupadd -r mysql && useradd -r -g mysql -s /sbin/nologin -M ...
- C# 委托/回调
public delegate void MyDelegate();//定义一个委托类型 MyDelegate myDelegate;//创建一个委托变量 myDelegate = new MyDel ...