django 如何在DRF序列化器中访问路径url参数?

2ic8powd  于 2023-08-08  发布在  Go
关注(0)|答案(2)|浏览(134)

简短问题:

在Django DRF序列化器中访问url路径参数(不是url query 参数)的合适方法是什么?
例如,如何获取/api/blogposts/:blogid/comments中的blogid值。

上下文:

A有一个Django DRF API,其中我有一个类似于以下内容的URL:

/api/blogposts/:blogid/comments

字符串
由一般视图处理的:

from rest_framework import generics

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


blogcomment只是示例资源;我正在和不同的人一起工作)
此视图允许通过POST调用创建新注解。由于传统原因,请求还将包含blog_id作为请求主体参数。
在我的Serializer中,我想检查url中的:blogid是否与body中的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)。我知道一个url查询参数可以通过self.context['request'].query_params访问。

34gzjxbg

34gzjxbg1#

我不能说这是一个好方法,但建议替代:
你可以像这样在序列化器中访问你的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)

fkaflof6

fkaflof62#

当你使用像ListCreateAPIView这样的泛型API视图时,你可以在序列化器中访问url参数,比如:

blog_id = self.context['view'].kwargs["blog_id"]

字符串

相关问题