首页 > 解决方案 > 如何确保序列化程序中至少有一个字段不为空?

问题描述

我正在创建一个 API 来更新我的模型的一些字段,我希望这些字段是可选的。
同时,我不想接受一个空请求(一个空体的请求)

我尝试使用“required=False”,但这将允许空请求。

class NotificationsSerializer(serializers.Serializer):
    notify_add_friend = serializers.BooleanField(required=False)
    notify_added_to_group = serializers.BooleanField(required=False)

无论如何要为整个序列化程序或其他东西定义一个验证器吗?

标签: djangodjango-rest-frameworkdjango-serializer

解决方案


您可以使用对象级验证

对于特定领域:

class NotificationsSerializer(serializers.Serializer):
    notify_add_friend = serializers.BooleanField(required=False)
    notify_added_to_group = serializers.BooleanField(required=False)

    def validate(self, data):
        if 'notify_add_friend' not in data and 'notify_added_to_group' not in data:
            raise serializers.ValidationError("Must include either notify_add_friend or notify_added_to_group")
        return data

对于整个序列化程序:

class NotificationsSerializer(serializers.Serializer):
    notify_add_friend = serializers.BooleanField(required=False)
    notify_added_to_group = serializers.BooleanField(required=False)

    def validate(self, data):
        if not data:
            raise serializers.ValidationError("Must include at least one field")
        return data

推荐阅读