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

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

简短问题:

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

上下文:

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

  1. /api/blogposts/:blogid/comments

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

  1. from rest_framework import generics
  2. class MyCommentsView(generics.ListCreateAPIView):
  3. queryset = Comment.objects.all()
  4. serializer_class = CommentSerializer


blogcomment只是示例资源;我正在和不同的人一起工作)
此视图允许通过POST调用创建新注解。由于传统原因,请求还将包含blog_id作为请求主体参数。
在我的Serializer中,我想检查url中的:blogid是否与body中的blog_id相同。目前我做了以下工作,但路径分割和元素选择感觉非常脆弱(例如:如果我在urls.py中重新构造URL,我需要调整自定义解析)。那么,有没有更好的办法呢?

  1. class CommentSerializer(serializers.ModelSerializer):
  2. class Meta:
  3. model = Comment
  4. fields = [..., 'blog_id', ... ]
  5. ...
  6. def validate_blog_id(self, value):
  7. # Better way for next line?
  8. blogid_in_url = int(self.context['request'].path.split('/')[-2])
  9. if blogid_in_url != value:
  10. ...

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

34gzjxbg

34gzjxbg1#

我不能说这是一个好方法,但建议替代:
你可以像这样在序列化器中访问你的url参数:

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

字符串
另一种方法,你可以覆盖ListCreateAPIView的create方法;

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

展开查看全部
fkaflof6

fkaflof62#

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

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

字符串

相关问题