2015-01-27 6 views
14

मेरे पास एक धारावाहिक है जो अन्य फ़ील्ड के मानों के आधार पर फ़ील्ड को मान्य करता है, त्रुटि प्रतिक्रिया में मैं फ़ील्ड त्रुटि के रूप में प्रत्येक फ़ील्ड त्रुटि को दिखाना चाहता हूं "non_field_errors" के तहत सबकुछ दिखाने का विरोध किया, जो तब होगा जब मैं ऑब्जेक्ट-स्तरीय मान्य विधि में सत्यापन प्रमाणीकरण को बढ़ाऊं।django rest framework: serializer मान्य से फ़ील्ड-स्तरीय त्रुटि सेट करें() विधि

MySerializer(ModelSerializer): 
    ... 
    def validate(self, data): 
     field_val1 = data['field_val1'] 
     field_val2 = data['field_val2'] 
     if not self._is_field_valid(field_val1, field_val2): 
      # The below line is how I would do what I want with Django 
      # Forms, however, it's not valid in DRF 
      self._errors['field_val1'] = 'this field is not valid' 

वांछित त्रुटि प्रतिक्रिया है::

{'field_val1': ['this field is not valid']} 

उत्तर

29

मैं "BaseSerializer" खंड में यह पता लगा, दस्तावेज की this पृष्ठ पर नीचे मैं क्या हासिल करने की कोशिश कर रहा हूँ का एक उदाहरण है , एक उदाहरण है जो दिखाता है कि प्रमाणीकरण त्रुटि प्रारंभिकरण पर एक शब्दकोश तर्क ले सकती है।

यदि मैं raise ValidationError({'field_val1': ['this field is not valid']}) मुझे जेएसओएन प्रतिक्रिया मिलती है तो मुझे मिलती है।

+2

धन्यवाद इस के लिए बहुत बहुत। मैंने स्रोत को गलत समझा, और नहीं सोचा कि यह काम करेगा। यह वही है जो मुझे –

+3

की आवश्यकता है, यह भी 'इस क्षेत्र की आवश्यकता है' प्रतिक्रियाओं की नकल करने के लिए अच्छी तरह से काम करता है। – tyebillion

+0

सूची में त्रुटि संदेश को लपेटने की कोई आवश्यकता नहीं है। –

1
@ द्वारा इसी तरह जवाब देने के लिए

Jkk.jonah, यह एक ValidationError को जन्म देती है, लेकिन यह करने के लिए फिर से लागू अनुवाद की आवश्यकता के बिना मूल अपवाद पाठ पुनः उपयोग कर लेता:

try: 
    serializer.fields['field_val1'].fail('required') 
except ValidationError as exc: 
    raise ValidationError({ 
     'field_val1': exc.detail, 
    }) 

डिफ़ॉल्ट रूप से (यानी पर rest_framework.fields.Field वर्ग), उपलब्ध चाबियाँ हैं:

default_error_messages = { 
    'required': _('This field is required.'), 
    'null': _('This field may not be null.') 
} 

उपवर्गों वहाँ अपने स्वयं के त्रुटि संदेश जोड़ सकते हैं (और SerializerField का एक उपवर्ग है)।

Btw, नई त्रुटि संदेश स्वतः मौजूदा (विरासत में मिला है) संदेश के साथ विलय हो जाएगा - अधिरोहित जा नहीं होगा के रूप में उम्मीद की जा सकती।

0

आप सभी क्षेत्रों पर लागू होने वाला तर्क है, तो आप अभी भी ऐसा करने से इच्छित परिणाम प्राप्त कर सकते हैं:

def validate(self, data): 
    for key, value in data.items(): 
     # checks if value is empty 
     if not value: 
      raise serializers.ValidationError({key: "This field should not be left empty."}) 

    return data