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

时间:2014-08-21 22:05:32

标签: python django django-rest-framework

我目前正在将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

问题是,在调用validate_the_field之前调用from_native并且原始数据甚至没有传递给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

但这只是一种处理问题的hacky方式,特别是因为Django rest_framework通常很干净。有没有人知道处理与from_native一起使用的垃圾数据的方法?

1 个答案:

答案 0 :(得分: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