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
        )

 

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