Python_Django

[Django] 动态序列化方法字段

2022-03-06  本文已影响0人  alue

需求:使用Django REST framework序列化文章模型,同时根据request参数,返回高亮的查询结果。

可以用SerializerMethodField来实现这个需求。

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Article
        fields = "__all__"

    highlight = serializers.SerializerMethodField()

    def get_highlight(self, obj: models.Article):
        """
        问题的关键在于,怎么在这里获得用户请求参数
        """
        # 可以利用 context 获得查询参数
        query = self.context['query']
        return highlight(self.text,query)

因为get_highlight方法参数里并没有用户请求,我们需要借助上下文参数 context 来传递查询参数。如何设置 context 呢? 可以在 ViewSet中,利用 get_serializer_context方法实现 context 的扩充。示例如下:

class ArticleViewSet(viewsets.ModelViewSet):
    serializer_class = serializers.ArticleSerializer

    def get_serializer_context(self) -> dict[str, Any]:
        context: dict[str, Any] = super().get_serializer_context()
        query = self.request.GET.get('q', None)
        context["query"] = query
        return context
    ...

短短几行代码,就能够实现文章的增删改查和结果高亮显示的后端逻辑。

上一篇 下一篇

猜你喜欢

热点阅读