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