需求:使用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
...
短短几行代码,就能够实现文章的增删改查和结果高亮显示的后端逻辑。
网友评论