2014-05-19 12 views
7

में नेस्टेड ऑब्जेक्ट्स मैं केवल विदेशीकी (या यूआरएल) की बजाय एक धारावाहिक के अंदर एक नेस्टेड ऑब्जेक्ट रखना चाहता हूं। this documentation के रूप में कहते हैं, मैं सिर्फ माता-पिता serializer में नेस्टेड वस्तु की serializer वर्ग निर्दिष्ट करने के लिए किया था:डीजेगो-रेस्ट-फ्रेमवर्क, सेरिआलाइजर्स

# Models 

class NestedSample(models.Model): 
    something = models.CharField(max_length=255) 

class Sample(models.Model): 
    thing = models.BooleanField() 
    nested = models.ForeignKey(NestedSample) 

# Serializers 

class NestedSampleSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = api_models.NestedSample 

class SampleSerializer(serializers.HyperlinkedModelSerializer): 
    nested = NestedSampleSerializer() # HERE! 

    class Meta: 
     model = api_models.Sample 

# Views 

class NestedSampleViewSet(viewsets.ModelViewSet): 
    queryset = api_models.NestedSample.objects.all() 
    serializer_class = api_serializers.NestedSampleSerializer 

class SampleViewSet(viewsets.ModelViewSet): 
    queryset = api_models.Sample.objects.all() 
    serializer_class = api_serializers.SampleSerializer 

यह बहुत अच्छी तरह से जब मैं वस्तुओं मिल में काम करता है, लेकिन यह बनाने के लिए संभव नहीं है (= POST) Sample वस्तुओं अब, मैं त्रुटि मिलती है:

:

{u'non_field_errors': [u'Invalid data']} 

मैं viewset में create विधि अधिलेखित करने के लिए पी का उपयोग कर वस्तु प्राप्त करने की कोशिश

लेकिन यह भी काम नहीं करता है।

कोई विचार?

मुझे भी this question मिला है, मैं इस बात से संबंधित हो सकता हूं कि समस्या किस तरह हल करती है लेकिन मुझे पूरी नेस्टेड ऑब्जेक्ट का पर्दाफाश न करने दें, इसलिए शुरुआत में वापस जाएं।

धन्यवाद,

+0

आपको अपने अनुरोध डेटा को NestedSample उदाहरण के साथ पॉप्युलेट करने के लिए ओवरराइड 'create' की आवश्यकता नहीं है, पीके स्ट्रिंग स्वयं ही काम करनी चाहिए। – Fiver

+0

यह उत्तर देखें: http://stackoverflow.com/questions/23686888/how-to-implement-nested-models-routes/23696134#23696134 – YAtOff

उत्तर

2

मैं इस समस्या के दो समाधानों के बारे में सोच सकता हूं। मैं पहले को पसंद करता हूं।

पहले समाधान:

वस्तुओं को बनाने के एक Django मॉडल फार्म का उपयोग करें। निर्माण और अद्यतन विधियों को ओवरराइड करें। नमूना बनाने का तरीका:

def create(self, request): 
    form = SampleForm(data=request.POST) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.save() 
     return Response(dict(id=instance.pk), status=status.HTTP_201_CREATED) 
    return Response(form.errors, status=status.HTTP_400_BAD_REQUEST) 

इस तरह आप किसी भी तरह की सत्यापन के साथ नमूना वस्तुओं को बना सकते हैं।

दूसरा समाधान:

अवहेलना get_serializer_class विधि और अनुरोध पद्धति पर आधारित serializer वर्ग लौटने। पोस्ट के लिए दो सीरियलाइज़र को परिभाषित करें और एक सूची के लिए रखें और पुनर्प्राप्त करें।

2

क्या आप पुष्टि कर सकते हैं कि आप एक JSON एन्कोडेड अनुरोध भेज रहे हैं - यानी अनुरोध में JSON पर सामग्री प्रकार सेट है? यदि नहीं, तो पोस्ट शायद फ़ॉर्म प्रारूप का उपयोग करके भेजता है जो नेस्टेड का समर्थन नहीं करता है।

+0

नहीं, मैं केवल बुनियादी प्रारूप का उपयोग करके मान भेजता हूं, मुझे नहीं पता इसका नाम: '? thing = 1 और nested = 2' और मैं मौजूदा नेस्टेड ऑब्जेक्ट का 'pk' भेजता हूं, मैं एक नया निर्माण नहीं करना चाहता हूं। – db0

+0

मेरे परीक्षणों में rest_framework.test.APIClient का उपयोग करके यह मेरे लिए तय किया गया। (http://www.django-rest-framework.org/api-guide/testing#apiclient) – yndolok

+0

यह पहला उल्लेख है कि मुझे परीक्षण समय पर एन्कोडिंग सही होने का पता चला - धन्यवाद @XavierOrdoquy ... प्रारूप 'जोड़ना = 'json'' ने मेरे' client.post' अनुरोध पर परीक्षण समय पर यह मेरे लिए तय किया। – jamesc

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^