Django个人博客搭建教程---restful-api动态序列化

59 篇文章 3 订阅

定义restfulapi的路由地址

router = routers.DefaultRouter()

注册restfulapi的路由地址

router.register(r'posts', views.PostDetailViewSet, basename='post')

这个时候考虑到文章列表和详情两个接口的序列化内容不一致,简单来说就是需要序列化的字段不一样,那么需要两个序列化器,动态调用

序列化器

先给出需要特殊序列化的外键关联字段的序列化器

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = [
            'id',
            'name',
        ]


class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = [
            'id',
            'name',
        ]


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = BlogUser
        fields = [
            'id',
            'name',
        ]

然后是文章列表和详情的序列化器 

# 列表序列化器
class PostListSerializer(serializers.ModelSerializer):
    category = CategorySerializer()
    authorname = UserSerializer()
    tags = TagSerializer(many=True)

    class Meta:
        model = Articles
        fields = [
            'id',
            'title',
            'body',
            'timestamp',
            'tags',
            'category',
            'authorname',
            'views',
        ]


# 详情序列化器
class PostRetrieveSerializer(serializers.ModelSerializer):
    category = CategorySerializer()
    authorname = UserSerializer()
    tags = TagSerializer()
    body_html = serializers.CharField()

    class Meta:
        model = Articles
        fields = [
            "id",
            "title",
            "body",
            "body_html",
            "timestamp",
            "views",
            "category",
            "authorname",
            "tags",
        ]

视图集动态调用

HTTP 请求对应 action 属性的值
GETlist(资源列表)/ retrieve(单个资源)
PUTupdate
PATCHpartial_update
DELETEdestory

第一种,疯狂写if/else做判断

class PostViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    # serializer_class = PostListSerializer
    queryset = Articles.objects.all()
    permission_classes = [AllowAny]

    def get_serializer_class(self):
        if self.action == 'list':
            return PostListSerializer
        elif self.action == 'retrieve':
            return PostRetrieveSerializer
        else:
            return super().get_serializer_class()

第二种,通过字典的形式给出

class PostDetailViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):

    queryset = Articles.objects.all()
    permission_classes = [AllowAny]

    serializer_class_table = {
        'list': PostListSerializer,
        'retrieve': PostRetrieveSerializer,
    }

    def get_serializer_class(self):
        return self.serializer_class_table.get(
            self.action
        )

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值