为了账号安全,请及时绑定邮箱和手机立即绑定

Django Rest Framework - 定义必填字段

Django Rest Framework - 定义必填字段

DIEA 2021-12-26 14:34:55
编辑我只想在我这样做时引发异常BrokerSerializer(user).data并且任何值是None我使用 DRF 来序列化对象以通过 API 导出它们,我不使用它来创建对象。在序列化模型时寻找一种最简单的方法来使字段成为必需的。API 需要一些字段不为空,所以我想提高APIMissingDataException它们中的任何一个是否为空/无。我试过:class BrokerSerializer(serializers.ModelSerializer):    import_id = serializers.IntegerField(source='pk')    deleted = serializers.SerializerMethodField()    full_name = serializers.CharField(source='userprofile.get_display_name')    phone_work = serializers.CharField(source='userprofile.contact_information.telephone')    email_work = serializers.CharField(source='userprofile.contact_information.email')class Meta:    model = User    fields = ['import_id', 'deleted', 'full_name', 'phone_work', 'email_work']    required_fields = fieldsdef validate(self, attrs):    super().validate(attrs)    if not all([attrs.get(fieldname) for fieldname in self.Meta.required_fields]):        raise APIMissingDataException()    return attrsdef get_deleted(self, obj):    return 0但是validate由于某种原因没有调用函数。我不想明确定义所有字段只是为了required=False向它们添加参数。In [10]: b = BrokerSerializer(User.objects.first())                                                                                                                                                  In [11]: b.data                                                                                                                                                                                       # It should have raised exception since there are NoneOut[11]: {'import_id': 1, 'deleted': 0, 'full_name': None, 'phone_work': None, 'email_work': None}In [12]: b = BrokerSerializer(data=User.objects.first())                                                                                                                                             In [13]: b.is_valid()                                                                                                                                                                                Out[13]: False有没有更舒服的方法?
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

DRF 具有处理它的内置方法。

name = serializers.CharField(label="name field",required=True, allow_blank=False, allow_null=False)

然后用于serializer.is_valid()验证数据。

有关更多详细信息,请参阅


查看完整回答
反对 回复 2021-12-26
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

我希望这个答案在这里也适用:)

总结
验证过程只在Deserialization过程(输入是一个dict类似的对象)并且你正在尝试一个Serialization过程时进行。在 的情况下Serialization,DRF 假定给定对象是有效对象,因此不需要验证。

查看完整回答
反对 回复 2021-12-26
  • 2 回答
  • 0 关注
  • 339 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信