在为REST定义唯一约束时,将消息作为serialized._errors的一部分

时间:2017-01-08 13:52:11

标签: django django-rest-framework

基于this post,我对我的序列化器设置了一个唯一性约束:

class UserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(validators=[
        UniqueValidator(
            queryset = User.objects.all(),
            message=_('Such email is already registered in the system'),
        )]
    )
    class Meta:
        model = User
        fields = ('username', 'password', 'email', )

在views.py中,我有:

def create_user(request):
    serialized = UserSerializer(data=request.data)
    if serialized.is_valid():
        #....
    else:
       return Response({'success': False,
                        'detail': serialized._errors,
                        'object': None},
                        status=status.HTTP_400_BAD_REQUEST)

现在,问题在于,通过我的整个API,我使用了json响应的标准化结构,而在detail部分,第三方开发人员总是期望带有错误消息的字符串。但是,serialized._errors返回dict: {'email': [u'Such email is already registered in the system']},问题在于我需要带有错误消息的纯字符串。我知道我可以使用serialized._errors['email'][0],但问题是,python / Django是否提供了任何神奇的通用语法,我可以使用它来代替serialized._errors来提取字符串消息而不管唯一字段名称?或者也许我应该以某种方式改变约束定义的结构来实现这个目标?

return Response({'success': False,
                 'detail': MAGIC_OPERATOR,
                 'object': None},
                 status=status.HTTP_400_BAD_REQUEST)

1 个答案:

答案 0 :(得分:1)

我建议你只编写一个默认视图来解析你的serialized._errors对象并返回一个自定义JSON:

def default_error_response(serialized):
    # Display only the first error and exit the function
    # Edit this logic, if one day you decide to concat all error messages    
    # into one string
    for key in serialized._errors:
        return Response({'success': False,
                         'detail': "%s" % (serialized._errors[key][0]),
                         'error_code': None,
                         'object': None}, status=status.HTTP_400_BAD_REQUEST)

然后在你的REST视图中:

if serialized.is_valid():
  #...
else:
  return default_error_response(serialized)