在Django rest_framework的序列化器自定义字段中处理无效数据

2 投票
1 回答
1143 浏览
提问于 2025-04-18 18:07

我现在正在扩展Django的rest_framework中的serializers.WritableField,目的是把数据转换成更适合前端使用的格式。我的代码是这样的:

class FooField(serializers.WritableField):
    def from_native(self, value):
        return #makeFoo

    def to_native(self, value):
        return #undoFoo

然后我有一个序列化器,看起来是这样的:

class FooUsingSerializer(serializers.ModelSerializer):
    the_field = FooField(source='a_model_field')

    def validate_the_field(self,attrs):
        #validate result

        return attrs

问题是,from_native这个方法在validate_the_field之前被调用,而原始数据并没有传递给validate_the_field。所以如果传入了一些无效的数据(在我的例子中,就是任何不是有效日期的数据),那么validate_the_field并不能捕捉到这些错误,结果我会返回一个500错误。我考虑过这样的做法:

def from_native(self, value):
    try:
        return #makeFoo
    except:
        return #a flag to show that the data wasn't valid

但我觉得这只是个临时的解决办法,尤其是因为Django的rest_framework通常是比较整洁的。有没有人知道一个更好的方法来处理这些无效数据,能和from_native很好地配合?

1 个回答

0

其实,如果你看看DRF的代码,你会发现很多扩展了WritableField的字段都是这样进行验证的。我们以DecimalField为例:

class DecimalField(WritableField):

    def from_native(self, value):
        ...
        try:
            value = Decimal(value)
        except DecimalException:
            raise ValidationError(self.error_messages['invalid'])
        return value

撰写回答