django - DRF 序列化程序检查未定义字段
问题描述
我曾经drf
并且也曾经serializer
用来检查用户输入。
这是我的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' 而只是传递数据。
是否有任何功能可以验证是否在序列化程序中定义了字段?
谢谢。
解决方案
您可以像这样更新验证方法:
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
在这里,它将检查是否有任何额外的字段通过序列化程序并与现有字段进行比较。如果它存在,那么它将抛出错误(或 make is_valid() == false
)。有关更多信息,您可以查看此答案。
推荐阅读
- javascript - 在 sagas 中使用种族的优势
- android - 与 Room 和 LiveData 的多对多关系
- c - 语言环境在 Linux 中是如何工作的?
- git - Git rebase squash 通过哈希提交
- javascript - 在 Click jQuery 上使用 JSON 数据填充 DataTable
- javascript - Javascript计时器自动加载而不是点击事件
- audio - 将 Windows 10 上的音频延迟一秒
- php - Laravel 通过自定义 ID 选择用户名
- angular - 使用 ng-packagr 它无法识别我的 tsconfig 路径
- asp.net - 尝试访问谷歌分析时指定的提供商类型无效