drf 的权限问题和 serializer 问题

  • drf 基本的权限认证使用 permission_classes 配置
    它会调用内部的 get_permissions() 方法。
    最近遇到一个问题,当用户获取自己的权限时,希望用户是登录状态,因此可以配置 permission_classes,但是 restful_api讲究的是对资源的操作,因此在创建用户时候,也应该对用户这一实体进行操作。这样就必须放在同一个 viewset 中。这时如果简单配置 permission_classes 的话,创建用户时就也要登录,不符合常理。所以可以考虑重写 get_permissions() 方法
def get_permissions(self):
    # action 属性只有使用 viewset 的时候才存在
    if self.action == 'retrieve':
        return [permissions.IsAuthenticated()]
    elif self.action == 'create':
        return []
    return []
  • 需要多个 serializer
    如果一个 viewset 需要多个 serializer,可以重写 get_serializer_class 方法
    def get_serializer_class(self):
        if self.action == 'retrieve':
            return serializer1
        elif self.action == 'create':
            return serializer2
        return serializer2
  • 获取当前用户
    restful_api 推荐使用这种格式 /users/id,那么可以考虑重写 get_object()
def get_object(self):
    return self.request.user
  • serializer 的验证
    在 serializer 的配置中,有时需要验证某些字段,某些简单的验证可以使用基础的字段来验证,例如验证手机号:
mobile = serializers.CharField(max_length=11, min_length=11, required=True)

如果还有其他的要求可以自定义

# 注意一定要以 validate_ 为名称
def validate_mobile(self, mobile):
    pass
    return mobile

你可能感兴趣的:(drf 的权限问题和 serializer 问题)