基于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)
答案 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)