【发布时间】: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
(blog 和 comment 只是示例资源;我正在使用不同的资源)
此视图允许通过 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