获取在DRF现场级验证另一个字段的值

问题描述 投票:8回答:2

我在我的串行器使用Field level Validation和我情况下,我需要的第一个字段的值,而验证第二场。我知道在object level validation我可以访问到,但我serailzer有many=True和对象级的验证我不能告诉迭代都提出了错误的客户端。

Serailzer:

class Keys_Serializer(serializers.Serializer):
    """
    """
    key_id = serializers.IntegerField(required=True)
    key_name = serializers.CharField(required=True)
    value_id = serializers.IntegerField(required=False)

    def validate_key_id(self, value):
        """
        validate key id
        """
         *** validate key_id here ***
        return value

    def validate_value_id(self, value):
        """
        validate value_id w.r.t key_id
        """
         *** I need key_id of current iteration here so that I can validate value_id. ***
        return value

是否有value_id验证访问KEY_ID价值的任何方式。

django django-rest-framework
2个回答
14
投票

不,那是不可能的。如果您需要访问一个以上的价值,你必须使用Object-level validationsee docs):

class Keys_Serializer(serializers.Serializer):

    key_id = serializers.IntegerField(required=True)
    key_name = serializers.CharField(required=True)
    value_id = serializers.IntegerField(required=False)

    def validate(self, data):
        # here you can access all values
        key_id = data['key_id']
        value_id = data['value_id']
        # perform you validation
        if key_id != value_id:
            raise serializers.ValidationError("key_id must be equal to value_id")
        return data

-1
投票

你可以使用以下方法中,所有字段的值。

def validate_myfield(self, value):
   data = self.get_initial() # data for all the fields
   #do your validation

© www.soinside.com 2019 - 2024. All rights reserved.