【问题标题】:Handling invalid data in Django rest_framework's serializer custom fields处理 Django rest_framework 的序列化器自定义字段中的无效数据
【发布时间】:2014-08-21 22:05:32
【问题描述】:

我目前正在扩展 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 配合使用?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    实际上,如果您查看 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
    

    【讨论】:

    • 非常好!他们不仅会引发 ValidationErrors,而且在其他地方他们甚至直接从 BaseSerializer.from_native() 调用 perform_validation 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2011-05-27
    相关资源
    最近更新 更多