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