从 django rest 框架中的序列化程序发送自定义错误响应?

Posted

技术标签:

【中文标题】从 django rest 框架中的序列化程序发送自定义错误响应?【英文标题】:Send Custom Error response from serializer in django rest framework? 【发布时间】:2018-04-29 18:10:32 【问题描述】:

我想将来自序列化程序创建视图的自定义响应发送到我的应用程序的前端。我尝试了休息框架响应教程,但它不起作用。我的代码是:

class UserSerializer(serializers.ModelSerializer):
"""Serializer to serialize user model object"""

    class Meta:
        model = User
        fields = ('id', 'username', 'password', 'first_name', 'last_name')
        extra_kwargs = 'password': 'write_only': True

    def create(self, validated_data):
        """create a new user"""

        firstname = self.initial_data['first_name']
        lastname = self.initial_data['last_name']
        fullname = str(firstname) +" "+ str(lastname)
        email = self.initial_data['username'].lower()

        try:
           customer = User.create(
                name=fullname,
                email=email)

        except Error as e:
            error = 'message': e._message or 'Unknown error'
            return Response(error,status=status.HTTP_400_BAD_REQUEST)

【问题讨论】:

【参考方案1】:

serializers.py

class UserSerializer(serializers.ModelSerializer):
"""Serializer to serialize user model object"""

    class Meta:
        model = User
        fields = ('id', 'username', 'password', 'first_name', 'last_name')
        extra_kwargs = 'password': 'write_only': True

    def create(self, validated_data):
        """create a new user"""

        firstname = validated_data['first_name']
        lastname = validated_data['last_name']
        fullname = str(firstname) +" "+ str(lastname)
        email = validated_data['username'].lower()

        try:
           customer = User.objects.create(
                name=fullname,
                email=email)
           return customer

        except Exception as e:
            error = 'message': ",".join(e.args) if len(e.args) > 0 else 'Unknown Error'
            raise serializers.ValidationError(error)

【讨论】:

非常感谢。 @origamic【参考方案2】:

因此,您希望从此视图更改用户的表示形式(JSON 响应的形状)。为此,您需要更改序列化程序中的.to_representation(self, obj) 方法:

class UserSerializer(serializers.ModelSerializer):
    """Serializer to serialize user model object"""
     class Meta:
        model = User
        fields = ('id', 'username', 'password', 'first_name', 'last_name',)
        write_only_fields = ('id', 'password',)

    def to_representation(self, obj):
        return 
            'firstname': obj.first_name,
            'lastname': obj.last_name,
            'fullname': obj.first_name+' '+obj.last_name,
            'email': obj.username.lower()
        

这应该意味着,无论何时发出使用此序列化程序的请求,用户都只会在 JSON 中看到这 4 个字段,例如


    "firstname":"Salman",
    "lastname": "Ahmed",
    "fullname": "Salman Ahmed",
    "email": "salman_ahmed@email.com"

有关此is hidden in their docs here 的更多详细信息。

【讨论】:

感谢@Splatmistro 的回复。我只是将我的错误显示为自定义响应。每当我在用户创建过程中遇到错误时,我都会显示该错误。 哦,我误解了你的问题!

以上是关于从 django rest 框架中的序列化程序发送自定义错误响应?的主要内容,如果未能解决你的问题,请参考以下文章

嵌套序列化程序 django rest 框架中的上下文

使用 Django REST 框架序列化程序将 JSON 请求保存到数据库

序列化程序中的django rest框架更新方法,实例不会立即保存

将不在模型中的字段添加到 Django REST 框架中的序列化程序

django rest 框架序列化程序中的关系数据库

序列化多个模型并在一个 json 响应中发送全部 django rest 框架