- 概念
serializers 通常指代 “序列化器” 其作用是将数据进行序列化和反序列化。
序列化指,将对象转换为数据(比如json格式的数据),便于传输(比如发送和返回请求数据);反序列化则相反,是将数据(比如json数据)解析为对象。
序列化器还有一个重要作用是格式校验,即对象和json字段是否一一对应,或者需要校验某些必填字段,常用于web开发
2. 基础环境搭建
首先,需要安装`django - rest - framework`。如果使用`pip`,可以在命令行中运行`pip install django - rest - framework`。
2. 定义模型(以简单的博客应用为例)
假设我们有一个简单的博客应用,有Post(文章)和Comment(评论)两个模型。
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
commenter_name = models.CharField(max_length=100)
comment_text = models.TextField()
comment_date = models.DateTimeField(auto_now_add=True)
- 创建序列化器(Serializers)
-
简单序列化器(用于
Post模型)为
Post模型创建序列化器,用于将Post模型实例转换为 JSON 等格式,并能进行反序列化(将 JSON 数据转换为Post模型实例)。
from rest_framework import serializers
from.models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ['title', 'content', 'pub_date']
-
关联模型序列化器(用于
Comment模型) -
对于
Comment模型,因为它与Post模型有关联,所以在序列化器中需要处理这种关联关系。
class CommentSerializer(serializers.ModelSerializer):
post = PostSerializer() # 嵌套Post序列化器来展示关联的Post信息
class Meta:
model = Comment
fields = ['commenter_name', 'comment_text', 'comment_date', 'post']
- 在视图(Views)中使用序列化器(以基于类的视图为例)
- 用于
Post模型的视图
以下是一个简单的APIView用于获取所有Post文章列表和创建新文章。
from rest_framework.views import APIView
from rest_framework.response import Response
from.models import Post
from.serializers import PostSerializer
class PostListAPIView(APIView):
def get(self, request):
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
return Response(serializer.data)
def post(self, request):
serializer = PostSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400)
- 用于
Comment模型的视图
这是一个用于获取某篇文章下所有评论的视图。
class CommentListAPIView(APIView):
def get(self, request, post_id):
post = Post.objects.get(id=post_id)
comments = post.comment_set.all()
serializer = CommentSerializer(comments, many=True)
return Response(serializer.data)
- 配置 URLs(路由)
- 将上述视图与对应的 URL 路径关联起来,以便通过 API 访问。
from django.urls import path
from.views import PostListAPIView, CommentListAPIView
urlpatterns = [
path('posts/', PostListAPIView),
path('posts/<int:post_id>/comments/', CommentListAPIView),
]
在这个示例中,serializers发挥了关键作用。PostSerializer将Post模型的数据(标题、内容、发布日期)进行序列化和反序列化,CommentSerializer不仅序列化了Comment模型本身的数据(评论者姓名、评论内容、评论日期),还通过嵌套PostSerializer展示了与之关联的Post的信息。在视图中,通过这些序列化器可以方便地将模型数据转换为适合在 API 中传输的格式,并能够从 API 请求数据中创建或更新模型实例。