在Django Rest Framework中,如果我有一个检索视图(或者一个detail_route或任何其他路由,它意味着对一个项目而不是一个集合进行操作)那么我必须有一个名为pk
的参数要传入的主键或ID。
例如:
def retrieve(self, request, pk=None):
...
return Response(data={'id': pk})
我的问题是应用什么样的验证(如果有的话)来从URL中提取PK?此外,是否有一种惯用的方法来验证它,而不是在视图本身内联写入它?
我试过查看文档,但到目前为止还没有看到这个问题。
答案 0 :(得分:0)
使用pk
本身应该非常安全,因为它只是一个str
对象。除此之外,您可以使用DRF的序列化器字段进行验证。让我们说pk
是一个UUID。在字段实例上调用.to_internal_value()
将验证给定数据并返回UUID对象。
这里的好处是,这将自动抛出DRF ValidationError
(如果UUID无效),显示的行为与pk
是序列化程序验证失败的一部分相同。
from rest_framework import serializers
def retrieve(self, request, pk=None):
# throws ValidationError if pk is not a valid UUID
uuid = serializers.UUIDField().to_internal_value(data=pk)
return Response(data={'id': uuid})
旁注:您也可以使用Django的FormFields和.clean()
方法达到相同的效果,但您需要自己处理抛出的异常。