在DRF中的字段级别验证中获取另一个字段的值

时间:2016-04-11 13:05:46

标签: django django-rest-framework

我在我的序列化程序中使用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的值。

5 个答案:

答案 0 :(得分:1)

def validate(self, validated_data):
        """
        validate and verifies the user data before getting saved.
        :param validated_data: dict obj
        :return: validated_data
        """

        existing_data = self.to_representation(self.instance)

答案 1 :(得分:0)

因此,如果您要执行创建或更新操作,则可以在以下位置访问未经验证的普通数据:

self.context['view'].get_serializer().data

尽管其他解决方案实际上更干净,但是我们在分区表上只有一个模型,并且需要另一个指定分区的字段,因为我们没有在主键上进行分区,所以数据库不知道如何查找它。

编辑:看来该字段实际上是空白的,可能取决于以下情况,具体取决于使用序列化程序的方式(为此必须在ViewSet中使用)

self.context['view'].get_serializer().context['request'].data

答案 2 :(得分:0)

def validate_fieldname(self, value):
   data = self.context['request'].data

答案 3 :(得分:0)

另一种简单的解决方案是访问如下属性

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_name(self, value):
    #getting other field values as below
    self.initialdata
    #scrape data from initialdata
    # incase of updation time use 
    # self.instance and self.inistialdata together to get respective ones
    return  value

    

答案 4 :(得分:-1)

您可以使用以下方法获取所有字段的值。

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