gpt4 book ai didi

django - 如何访问 DRF 序列化程序中的路径 url 参数?

转载 作者:行者123 更新时间:2023-12-04 13:09:57 49 4
gpt4 key购买 nike

简短的问题:

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

上下文:

A 有一个 Django DRF api,我有一个类似于 url 的地方:

/api/blogposts/:blogid/comments

由通用 View 处理:

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

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

此 View 允许通过 POST 调用创建新评论。由于遗留原因,请求将包含 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 查询参数。

最佳答案

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

您可以像这样在序列化程序中访问您的 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)

关于django - 如何访问 DRF 序列化程序中的路径 url 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66492793/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com