में सत्यापन त्रुटि को उठाते समय त्रुटि कोड निर्दिष्ट करने के लिए कैसे करें मेरे पास एक एपीआई एंडपॉइंट है जो उपयोगकर्ताओं को खाता पंजीकृत करने की अनुमति देता है। मैं एक डुप्लिकेट उपयोगकर्ता नाम के लिए 400 के बजाय HTTP 40 9 वापस करना चाहता हूं।Django REST Framework serializer
from django.contrib.auth.models import User
from rest_framework.serializers import ModelSerializer
class UserSerializer(ModelSerializer):
username = CharField()
def validate_username(self, value):
if User.objects.filter(username=value).exists():
raise NameDuplicationError()
return value
class NameDuplicationError(APIException):
status_code = status.HTTP_409_CONFLICT
default_detail = u'Duplicate Username'
जब त्रुटि शुरू हो रहा है, प्रतिक्रिया है:: {"detail":"Duplicate Username"}
यहाँ मेरी serializer है। मुझे एहसास हुआ कि अगर मैं APIException subclass, detail
username
के बजाय उपयोग किया जाता है।
मैं इस प्रतिक्रिया के बजाय {"username":"Duplicate Username"}
करना चाहते हैं या मैं एक स्थिति कोड जब एक ValidationError को ऊपर उठाने निर्दिष्ट करने के लिए करना चाहते हैं:
def validate_username(self, value):
if User.objects.filter(username=value).exists():
raise serializers.ValidationError('Duplicate Username',
status_code=status.HTTP_409_CONFLICT)
return value
लेकिन जैसे ValidationError
केवल रिटर्न 400
क्या इसे पूरा करने का कोई और तरीका है?
ग्रेट, यह काम करता है। यदि मैं अलग-अलग विचारों के लिए अपवाद को कस्टमाइज़ करना चाहता हूं तो यह फ़ंक्शन बहुत जटिल हो जाएगा। चूंकि विचारों की संख्या बढ़ जाती है, यह कार्य भी बढ़ेगा। मुझे आश्चर्य है कि एक स्केल करने योग्य समाधान है या नहीं। – Cheng
क्या आप 'विस्तार' को ओवरराइड करना चाहते हैं? –
मेरा मतलब है कि अगर 3 अपवाद हैं जिन्हें मैं ओवरराइड करना चाहता हूं, तो मेरे पास 'custom_exception_handler' में if..elif..elif संरचना होगी। जितना अधिक अपवाद मैं अनुकूलित करना चाहता हूं, उतना अधिक ifs मुझे इस विधि में लिखना होगा। साथ ही, मुझे यह याद रखना होगा कि यदि शाखा जिम्मेदार है जिसके लिए दृश्य HTTP गतिविधि है। यह लाइन के नीचे एक असली मुद्दा हो सकता है। – Cheng