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

定义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 属性的值
GET list(资源列表)/ retrieve(单个资源)
PUT update
PATCH partial_update
DELETE destory

第一种,疯狂写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
        )

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章