2015-01-26 6 views
5

in einem Serializer aus dem Feld Feldern verwenden, Validierung Fehlermeldungen in etwa so aussehen:Validierungscodes und Meldungen in Django übrigen Rahmen

{ 
    "product": [ 
     "This field must be unique." 
    ], 
    "price": [ 
     "This field is required." 
    ] 
} 

jedoch für den API ich schreibe, würde ich bieten möge ein eindeutiger Fehlercode für jede fehlgeschlagene Validierung, sodass Clients programmgesteuert auf Validierungsfehler reagieren können oder ihre eigenen benutzerdefinierten Nachrichten in einer Benutzeroberfläche bereitstellen können. Im Idealfall würde der Fehler json etwa wie folgt aussehen:

{ 
    "product": [ 
     { 
      "code": "unique", 
      "message": "This field must be unique." 
     } 
    ], 
    "price": [ 
     { 
      "code": "required", 
      "message": "This field is required." 
     } 
    ] 
} 

Der derzeitige Ansatz validationerrors macht dies ziemlich schwierig werden. Beim Durchsehen des Codes scheint diese Art der Fehlerberichterstattung derzeit nicht unterstützt zu werden. Ich suche jedoch nach einem Ansatz, um die Fehlerbehandlung zu überschreiben, um zu diesem Modell zu passen.

+0

Könnten Sie die 'Serializer.is_valid' Methode überschreiben, ein Validation fangen, und die Art und Weise, es zu dem Fehler Wörterbuch hinzugefügt wird? Das setzt voraus, dass DRF oder Django die 'code' Werte hinzufügt, nach denen Sie suchen. – kdazzle

+0

Lassen Sie mich raten: Sie verwenden newforms (https://github.com/insin/newforms) – Catskul

+0

Tatsächlich gibt es Diskussionen für die Einbettung einer solchen Unterstützung in DRF, siehe https://github.com/tomchristie/django- rest-framework/pull/3169 –

Antwort

1

hinzufügen, so etwas zu Ihrem Serializer:

def is_valid(self, raise_exception=False): 
    try: 
     return super(ClientSerializer, self).is_valid(raise_exception) 
    except exceptions.ValidationError as e: 
     if 'email' in e.detail: 
      for i in range(len(e.detail['email'])): 
       if e.detail['email'][i] == UniqueValidator.message: 
        e.detail['email'][i] = {'code': 'not-unique'} 
     raise e 
+1

Ich denke, ich suchte nach etwas etwas allgemeinerem Zweck. Dies würde eine Anpassung pro Feld und pro Validierungsfehler erfordern, richtig? –

+1

Yup. Und es ist hässlich. Problem [# 2878] (https://github.com/tomchristie/django-rest-framework/issues/2878) wird alle Hässlichkeit beseitigen, wenn behoben. – WhyNotHugo

Verwandte Themen