Django Rest Framework-定义必填字段

时间:2019-04-02 14:27:22

标签: python django django-rest-framework django-serializer

编辑

我只想在执行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]: {}

有没有更舒适的方法?

2 个答案:

答案 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