我使用了drf
,也使用了serializer
来检查用户输入。
这是我的序列化程序。py
class BoardSerializer(serializers.Serializer):
user_id = serializers.IntegerField(required=True)
body = serializers.CharField(required=False)
并像这样使用它。
serializer = BoardSerializer(data=request.data)
if serializer.is_valid():
....
似乎没有检查未定义的字段。
例如,如果我请求{'user_id':1, 'body': 'abc', 'akak': 1}
,
is_valid()
不会捕获字段“ akak”,而只是传递数据。
是否有任何功能可以验证是否在序列化程序中定义了字段?
谢谢。
答案 0 :(得分:1)
您可以像这样更新验证方法:
class BoardSerializer(serializers.Serializer):
user_id = serializers.IntegerField(required=True)
body = serializers.CharField(required=False)
def validate(self, attrs):
unknown = set(self.initial_data) - set(self.fields)
if unknown:
raise serializers.ValidationError("Unknown field(s): {}".format(", ".join(unknown)))
return attrs
在这里,它将检查是否有多余的字段通过序列化程序并与现有字段进行比较。如果存在,则将引发错误(或使is_valid() == false
)。有关更多信息,您可以检查此so answer。
答案 1 :(得分:0)
因为在 BoardSerializer
中未定义 akak您需要在序列化程序中添加akak。
您可以在Seralizer中添加自定义字段akak
要捉襟见肘,试试这个
request.data.get('akak')
答案 2 :(得分:0)
是否应该在模型中创建akak
字段,所以必须在序列化程序中定义模型。
class BoardSerializer(ModelSerializer):
user_id = serializers.IntegerField(required=True)
body = serializers.CharField(required=False)
class Meta:
model = your-model