定义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
)

本文探讨了在RESTful API中使用Django REST框架进行序列化的方法,详细讲解了如何根据不同场景选择序列化器,包括文章列表和详情页的序列化处理。通过视图集动态调用序列化器,实现灵活的API响应。
508

被折叠的 条评论
为什么被折叠?



