2016-04-11 5 views
3

Ich verwende Field level Validation in meinem Serializer und ich habe Situation, wo ich Wert des ersten Feldes während der Validierung zweiten Feld benötigen. Ich weiß, in object level validation Ich kann Zugriff darauf haben, aber meine serailzer haben many=True und in Objekt-Level-Validierung kann ich Clientseite nicht sagen, welche Iteration den Fehler ausgelöst haben.Erhalten Wert eines anderen Feldes in Feld Ebene Validierung in DRF

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 

Gibt es eine Möglichkeit, den Wert von key_id in value_id Validierung des Zugriffs.

+0

, welche Version von Django Ruhe Framework verwenden Sie? –

+0

@MuhammadShoaib djangorestframework == 3.2.2 – user5594493

+0

können Sie versuchen, mit self.otherfieldname zugreifen und dann validieren? In der DRF-Version <3 gibt es einen Parameternamen 'attrs' mit jeder Validierungsmethode auf Feldebene und dann können Sie einfach auf die anderen Werte mit' attr ['field_name'] 'zugreifen. Aber ich bin nicht sicher, wie man das in der Version> 3 –

Antwort

5

Nein, das ist nicht möglich. Wenn Sie mehr als einen Wert zugreifen müssen, müssen Sie die Object-level validation (see docs) verwenden:

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 
+0

Ja, ich weiß, dass ich in der Validierung auf Objektebene darauf zugreifen kann und warum ich das nicht verwenden kann, wird in meiner Frage erwähnt. Ich habe mich also gefragt, ob es irgendeinen Haken oder etwas anderes gibt, mit dem ich auf andere Werte zugreifen kann? – user5594493

+0

@ user5594493 Nein, es gibt nichts anderes, fürchte ich. Dies sollte die akzeptierte Antwort sein. – Wtower

Verwandte Themen