我有一个序列化程序
class CategoryListSerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ["id", "name", "name_en", "about", "parent",]
它用于两个位置:
1.所有类别API:用于查看有关类别的详细信息。
1.所有帖子API:以前只知道类别的名称。
在我的Posts Serializer中,我使用了:
class PostListSerializer(serializers.ModelSerializer):
categories = CategoryListSerializer(many=True, )
class Meta:
model = Post
fields = ["id", "title", "description", "publish_date", "thumbnail", "owner", "categories", ]
在我的Post ViewSet中:
class PostViewSet(ReadOnlyModelViewSet):
queryset = Post.objects.all().filter(is_published=True)
serializer_class = PostListSerializer
这将返回CategoryListSerializer
中提到的所有类别详细信息的所有帖子。
问题:
我希望PostListSerializer
只返回相关Categories中的“name”字段,而不必定义另一个只选择“name”字段的CategorySimpleSerializer
。(我仍然需要另一个API中的CategoryListSerializer
字段)
有可能吗?
**注意:**这只是一个例子,我会有更多的用例,我想提前知道我是否需要创建许多自定义的“待嵌套”序列化器,以避免将一些不必要的数据暴露给 * 一些 * 的API。如果模型或API以后需要更改,那么看起来会有很多冗余的更新工作。
4条答案
按热度按时间yvfmudvl1#
正如@mtzd在评论中提到的:
创建一个通用的动态序列化器类(如在DRF文档这里)工作!
我的分类序列化器现在看起来像这样:
在
PostListSerializer
Categories变量中,我只添加了fields属性:因此,现在我可以管理要向我使用的每个View API显示哪些字段,从我可以修改/更新一次的单一模型序列化程序。
bvn4nwqk2#
对于您的用例,您应该使用如下所述的序列化程序。
您还需要将
Post.objects.all().filter(is_published=True)
优化为Post.objects.filter(is_published=True).select_related("categories")
idfiyjo83#
qvtsj1bj4#
在类别模型中,可以定义一个方法,该方法返回类别名称,如下所示
如docs stringrelatedfield中所述,在序列化器中:
在PostViewset中,因为你只需要只读模式,所以不需要更多的修改,但是如果它将用于创建帖子,你应该在www.example.com()方法中发送类别IDserializer.save,如下所示: