2017-10-24 1 views
0

Ich habe gerade angefangen zu lernen Django Rest Framework und ich kann nicht verstehen, , warum DRF Model Feld Validierung vor Own Validation Ich habe ein Modell, das eine URLField und im Grunde alles, was ich hinzufügen möchte http: // oder https: // bevor es überprüft, so schrieb Methode benutzerdefinierte ValidierungWarum Model Feld Validierung passiert vor Validierung oder validate_ <field> heißt?

class ShortenerSerializer(serializers.ModelSerializer): 
    class Meta: 
     extra_kwargs = { 
      'count': {'read_only':True} 
     } 
     fields = ('id', 'url', 'short_url', 'count', 'created_at') 
     model = Shortener 

    def validate_url(self, url): 
     if not 'http://' in url and not 'https://' in url: 
      url = 'http://' + url 
     url_validate = URLValidator() 
     try: 
      url_validate(url) 
     except: 
      raise serializers.ValidationError("Please Enter a Valid URL") 
     return url 

ich sogar die Validate Methode overide aber wieder ist es nach dem Modell der Feldüberprüfung genannt, wie Exception wirft. Ich denke, ich muss eine Methode außer Kraft setzen, aber keine Ahnung, welche man außer Kraft setzt.

Antwort

1

Sie können die is_valid Methode überschreiben, dieses Verhalten

class ShortenerSerializer(serializers.ModelSerializer): 
    def is_valid(self, *args, **kwargs): 
     if self.initial_data.get('url'): 
      # update self.initial_data with appended url 

     return super(ShortenerSerializer, self).is_valid(*args, **kwargs) 
+0

Ich erhalte diese QueryDict Instanz unveränderlich zu vermeiden ist. Ich habe das getan. 'def run_validation (self, Daten): \t \t \t url = data.get ('url') \t \t \t wenn url: \t \t \t \t wenn nicht 'http: //' in URL und nicht‚https : //‘in url: \t \t \t \t url = 'http: //' + url \t \t \t \t data [ 'url'] = url \t \t \t \t pri nt (Daten) \t \t \t Rückgabe super(). run_validation (Daten) ' –

+0

ah, hab es. habe meine Antwort bearbeitet, um die Methodennamen zu ändern. – arjun27

+0

immer noch die gleiche QueryDict-Instanz ist unveränderlicher Fehler. Ich mache so 'self.initial_data [' url '] =' http: // '+ self.initial_data.get (' url ') ' –

Verwandte Themen