python rest_framework serializers的应用示例

97 阅读2分钟
  1. 概念

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)
  1. 创建序列化器(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']
  1. 在视图(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)
  1. 配置 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发挥了关键作用。PostSerializerPost模型的数据(标题、内容、发布日期)进行序列化和反序列化,CommentSerializer不仅序列化了Comment模型本身的数据(评论者姓名、评论内容、评论日期),还通过嵌套PostSerializer展示了与之关联的Post的信息。在视图中,通过这些序列化器可以方便地将模型数据转换为适合在 API 中传输的格式,并能够从 API 请求数据中创建或更新模型实例。