Django休息框架pk默认验证

时间:2018-02-19 16:16:27

标签: python django-rest-framework

在Django Rest Framework中,如果我有一个检索视图(或者一个detail_route或任何其他路由,它意味着对一个项目而不是一个集合进行操作)那么我必须有一个名为pk的参数要传入的主键或ID。

例如:

def retrieve(self, request, pk=None):
     ...
     return Response(data={'id': pk})

我的问题是应用什么样的验证(如果有的话)来从URL中提取PK?此外,是否有一种惯用的方法来验证它,而不是在视图本身内联写入它?

我试过查看文档,但到目前为止还没有看到这个问题。

1 个答案:

答案 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()方法达到相同的效果,但您需要自己处理抛出的异常。