Django休息框架自定义响应消息,用于不同的验证

时间:2017-12-27 02:44:22

标签: python django django-rest-framework response

所以我想根据序列化程序验证为不同的失败创建自定义消息。但我只能找到如何为成功创建标准自定义响应并且只能失败。虽然我想要创建的唯一响应是失败的提示消息。

我找到了其中一个帖子,但它并不是我想要的错误代码 来源:Django Rest Framework custom response message

基本上,错误消息必须基于serializer.py

中的特定验证错误

这是我的代码

serializer.py

class UserCreate2Serializer(ModelSerializer):
email = EmailField(label='Email Address')
valid_time_formats = ['%H:%M', '%I:%M%p', '%I:%M %p']
birthTime = serializers.TimeField(format='%I:%M %p', input_formats=valid_time_formats, allow_null=True, required=False)

class Meta:
    model = MyUser
    fields = ['username', 'password', 'email', 'first_name', 'last_name', 'gender', 'nric', 'birthday', 'birthTime', 'ethnicGroup']
    extra_kwargs = {"password": {"write_only": True}}

def validate(self, data):  # to validate if the user have been used
    email = data['email']
    user_queryset = MyUser.objects.filter(email=email)
    if user_queryset.exists():
        raise ValidationError("This user has already registered.")
    return data

# Custom create function
def create(self, validated_data):
    username = validated_data['username']
    password = validated_data['password']
    email = validated_data['email']
    first_name = validated_data['first_name']
    last_name = validated_data['last_name']
    gender = validated_data['gender']
    nric = validated_data['nric']
    birthday = validated_data['birthday']
    birthTime = validated_data['birthTime']
    ethnicGroup = validated_data['ethnicGroup']

    user_obj = MyUser(
        username = username,
        email = email,
        first_name = first_name,
        last_name = last_name,
        gender = gender,
        nric = nric,
        birthday = birthday,
        birthTime = birthTime,
        ethnicGroup = ethnicGroup,
    )
    user_obj.set_password(password)
    user_obj.save()
    return validated_data

views.py

class CreateUser2View(CreateAPIView):
    permission_classes = [AllowAny]
    serializer_class = UserCreate2Serializer
    queryset = MyUser.objects.all()

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        if not serializer.is_valid(raise_exception=False):
            return Response({"promptmsg": "You have failed to register an account"}, status=status.HTTP_400_BAD_REQUEST)

        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response({'promptmsg': 'You have successfully register'}, status=status.HTTP_201_CREATED, headers=headers)

从序列化程序验证部分可以看到,如果存在电子邮件,则会显示此用户已注册的错误消息。对于用户名也是如此,但是Django有自己的验证,因为它是内置的。

有没有办法让错误信息像这样: 如果使用了用户名,而不是这个

    "username": [
    "A user with that username already exists."
]

到这个

    "promptmsg": [
    "A user with that username already exists."
] 

- 更新 -

models.py

class MyUser(AbstractUser):
    userId = models.AutoField(primary_key=True)
    gender = models.CharField(max_length=6, blank=True, null=True)
    nric = models.CharField(max_length=9, blank=True, null=True)
    birthday = models.DateField(blank=True, null=True)
    birthTime = models.TimeField(blank=True, null=True)
    ethnicGroup = models.CharField(max_length=30, blank=True, null=True)

    def __str__(self):
    return self.username

1 个答案:

答案 0 :(得分:0)

您可以在serializer.errors查看错误列表,了解validation的工作原理