2016-07-18 12 views
6

पर नेस्टेड धारावाहिक पर अद्वितीय सत्यापन मेरे पास ऐसा कोई मामला है, जहां आपके पास एक अद्वितीय क्षेत्र के साथ एक कस्टम नेस्टेड सीरियलाइज़र संबंध है। नमूना मामला:Django Rest Framework

class GenreSerializer(serializers.ModelSerializer): 

    class Meta: 
     fields = ('name',) #This field is unique 
     model = Genre 

class BookSerializer(serializers.ModelSerializer): 

    genre = GenreSerializer() 

    class Meta: 
     model = Book 
     fields = ('name', 'genre') 

    def create(self, validated_data): 
     genre = validated_data.pop('genre') 
     genre = Genre.objects.get(**genre) 
     return Book.objects.create(genre=genre, **validated_data) 

समस्या: जब मैं की तरह एक json वस्तु को बचाने की कोशिश { "नाम": "प्रिंस", "शैली": { "नाम": "इतिहास"}} डीआरएफ कोशिश शैली ऑब्जेक्ट को अद्वितीय बाधा को सत्यापित करने के लिए और यदि "इतिहास" मौजूद है तो मुझे अपवाद फेंक दें क्योंकि नाम "इतिहास" के साथ एक शैली अद्वितीय होनी चाहिए, और यह सच है लेकिन मैं केवल वस्तु को जोड़ने और एक साथ बनाने की कोशिश नहीं कर रहा हूं।

बहुत बहुत धन्यवाद !!

उत्तर

9

आप नेस्टेड serializer के लिए अद्वितीय सत्यापनकर्ता छोड़ देना चाहिए:

class GenreSerializer(serializers.ModelSerializer): 

    class Meta: 
     fields = ('name',) #This field is unique 
     model = Genre 
     extra_kwargs = { 
      'name': {'validators': []}, 
     } 

आप से पहले सुनिश्चित करें कि आप उस क्षेत्र पर अन्य प्रमाणकों की जरूरत नहीं है बनाने के लिए अपने serializer मुद्रित करने के लिए कर सकते हैं। यदि आपके पास कुछ है, तो आपको उन्हें सूची में शामिल करना होगा।

संपादित करें: यदि आपको सृजन के लिए विशिष्टता बाधा सुनिश्चित करने की आवश्यकता है, तो आपको serializer.is_valid को serializer.save से पहले और पहले के बाद दृश्य में करना चाहिए।

+0

बहुत बहुत धन्यवाद! लेकिन अगर मुझे नेस्टेड सीरियलाइज़र में सत्यापन की आवश्यकता होती है तो जब मैं इसे Genre उदाहरणों को सहेजने के लिए उपयोग करता हूं? क्या यह जांचने का कोई तरीका है कि मैं एक जेनरेशन उदाहरण बना रहा हूं और नहीं, यदि कोई पुस्तक उदाहरण बना रहा हो? फिर से धन्यवाद! –

+1

यह एक दूसरे सत्यापन चरण का हिस्सा होना चाहिए - ValidationError को बढ़ाकर बनाएं/अद्यतन भाग में कहें। – Linovia

+0

यह वास्तव में सहायक था! आपका बहुत बहुत धन्यवाद! –