编辑
我只想在执行BrokerSerializer(user).data
且任何值为None
时引发异常
我正在使用DRF序列化对象以通过API导出它们,我没有使用它来创建对象。
寻找最简单的方法来使模型序列化时需要输入字段。
API需要某些字段不为null,因此如果其中任何一个为null / None,我想提出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 = fields
def validate(self, attrs):
super().validate(attrs)
if not all([attrs.get(fieldname) for fieldname in self.Meta.required_fields]):
raise APIMissingDataException()
return attrs
def 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 None
Out[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
In [14]: b.data
Out[14]: {}
有没有更舒适的方法?
答案 0 :(得分:1)
我希望this answer在这里也适用:)
摘要
验证过程仅在Deserialization
过程 (输入类似于对象的 dict
)时经历 ,而您正在尝试 Serialization
过程 。对于 Serialization
,DRF假定给定对象是有效对象,因此不需要验证。
答案 1 :(得分:0)
DRF具有内置的方法来处理它。
name = serializers.CharField(label="name field",required=True, allow_blank=False, allow_null=False)
然后使用serializer.is_valid()
验证数据。
有关更多详细信息,请参阅this。