在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
问题是,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