在Django REST Framework中,如何防止在序列化数据中提交意外的密钥?

时间:2016-02-03 18:46:18

标签: django serialization django-rest-framework

例如,说我有:

class ContactSerializer(serializers.Serializer):
    name = serializers.CharField()

如果提交了意外字段height,如何引发错误:

ContactSerializer(data={'name': Jim, 'height': '1 mile'})

2 个答案:

答案 0 :(得分:1)

这是一个很好的问题。我最初假设DRF函数height(验证数据)会引发异常。我玩了一些例子,并没有抛出一个。

考虑到这一点,我不确定你是否可以阻止提交意外字段(如果你想要恶作剧)。您只能确保提交到适当字段的数据是有效类型。也就是说,您的序列化程序将忽略Private Sub Button1_Click() Handles Button1.Click If TryActive() = False Then Exit Sub End If 'Your code you want to execute if TryActive() is True End Sub Private Function TryActive() as Boolean Try AppActivate("your aplication") Return True Catch ex As Exception Dim msgboxresponse = MsgBox("please start your application", 0, "Can't find your application") If msgboxresponse = MsgBoxResult.Ok Then Return False End If End Try End Function 字段。

答案 1 :(得分:0)

DRF似乎不容易检查未指定的字段名称。 Marshmellow是另一个功能更丰富的Python库,用于Python中的对象序列化,部分受DRF序列化程序的启发;它允许通过使用模式级别(而不是字段级别)验证(Marshmellow Schema Validation)来进行此类检查。

class MySchema(Schema):
    foo = fields.Int()
    bar = fields.Int()

    @validates_schema(pass_original=True)
    def check_unknown_fields(self, data, original_data):
        for key in original_data:
            if key not in schema.fields:
                raise ValidationError('Unknown field name {}'.format(key))

schema = MySchema()
result, errors = schema.load({'foo': 1, 'bar': 2, 'baz': 3})