【问题标题】:How to access path url parameter in DRF serializer?如何在 DRF 序列化程序中访问路径 url 参数?
【发布时间】:2021-03-05 12:40:53
【问题描述】:

小问题:

在 Django DRF 序列化程序中访问 url 路径参数(不是 url query 参数)的适当方法是什么?

上下文:

A 有一个 Django DRF api,其中我有一个类似于:

/api/blogposts/:blogid/comments

由通用视图处理:

class MyCommentsView(generics.ListCreateAPIView):
       queryset = Comment.objects.all()
       serializer_class = CommentSerializer

blogcomment 只是示例资源;我正在使用不同的资源)

此视图允许通过 POST 调用创建新的 cmets。 由于遗留原因,请求将包含 blog_id 也作为请求正文参数。

在我的序列化程序中,我想检查 url 中的 :blogid 是否与正文中的 blog_id 相同。目前我执行以下操作,但路径拆分和元素选择感觉非常脆弱(例如,如果我在 urls.py 中重构我的 url,我需要调整我的自定义解析)。那么,有没有更好的办法呢?

class CommentSerializer(serializers.ModelSerializer):

    class Meta:
        model = Comment
        fields = [..., 'blog_id', ... ]

    ...

    def validate_blog_id(self, value):
        # Better way for next line?
        blogid_in_url = int(self.context['request'].path.split('/')[-2]) 
        if blogid_in_url != value:
             ...

注意: 我的问题是关于 url 路径参数,而不是 url 查询参数(如 api/blogposts?blogid=55 中的 blogid)。我知道可以通过self.context['request'].query_params 访问url 查询参数。

【问题讨论】:

  • 我建议你看看drf-nested-routers库,它可以让你使用Routers和嵌套资源,为你提供blog_id/blog_pk直接在某些视图方法中,以及通过视图内的self.kwargs 使其可用。

标签: django django-rest-framework


【解决方案1】:

我不能说这是一个好方法,但建议:

您可以像这样在序列化程序中访问您的 url 参数:

self.context.get('request').parser_context.get('kwargs').get(
        'blog_id') # your url parameter name here

另外一种方式,你可以覆盖ListCreateAPIView的create方法;

def create(self, request, *args, **kwargs):
    blog_id = kwargs.get('blog_id') # your url parameter name here
    serializer = self.get_serializer(data=request.data, 
                                     context={'blog_id': blog_id})
    serializer.is_valid(raise_exception=True)
    self.perform_create(serializer)
    headers = self.get_success_headers(serializer.data)
    return Response(serializer.data, status=status.HTTP_201_CREATED,
                    headers=headers)

【讨论】:

  • 看起来两者都是很好的解决方案,而且比我的更好。第二个更明确,但由于我不需要自定义 create(来自此用例),我将采用您的第一种方法。
猜你喜欢
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 2015-04-23
  • 2022-08-19
相关资源
最近更新 更多