2015-04-01 9 views
7

में serializer.data ओवरराइड मैं Django REST Framework के व्यवस्थापक पैनल के किसी फॉर्म फ़ील्ड के मान को बदलने की कोशिश कर रहा हूं और किसी कारण से परिवर्तन कभी नहीं होता है। मैंDjango रीस्ट फ्रेमवर्क

class SomeView(ModelViewSet): 
    queryset = MyModel.objects.all() 
    serializer_class = MyModelSerializer 

    # I Want to override this and change the POST data 
    def perform_create(self, serializer): 
    user = self.request.user.id 

    # this was a form field where I manually entered the user ID 
    # I now want it to default to the logged in user 
    serializer.data['user'] = user 

    # This returns the original user that was entered into the form field 
    print serializer.data 

नीचे serializer मैं dir() साथ serializer.data की जाँच की और यह सिर्फ एक अजगर शब्दकोश है तो मैं समझ नहीं क्यों मैं मूल्य को संशोधित नहीं कर सकते हैं। एक परीक्षण के रूप मैं अतिरिक्त मान जोड़ने के लिए कोशिश की, लेकिन है कि या तो

# this doesnt work 
serializer.data['some_new_field'] = 'test' 

संपादित

काम नहीं करता है एक और नोट पर, मैं डेटा कॉपी कर सकते हैं और संपादित यह

fake_data = serializer.data.copy() 
fake_data['old_value'] = 'new value' 

हालांकि यह हमेशा मान्य करने के लिए विफल रहता है

serializer = MyModelSerializer(data=fake_data) 
serializer.is_valid() # returns false 

संपादित:

ठीक है, इसलिए Django द्वारा SimpleLazyObject लौटने की वजह से सत्यापन त्रुटि उत्पन्न हुई थी। जब मैं डेटा पर प्रतिलिपि करता हूं तो सबकुछ अब काम करता है, लेकिन मैं वास्तव में उत्सुक हूं कि मैं इसे कॉपी किए बिना serializer.data संपादित क्यों नहीं कर सकता। समस्या अब हल हो गई है, लेकिन अगर कोई भी जिज्ञासा के लिए इस मुद्दे पर अंतर्दृष्टि प्रदान कर सकता है, तो यह बहुत ही अच्छा होगा।

उत्तर

7

मैंने dir() के साथ serializer.data की जांच की और यह सिर्फ एक अजगर शब्दकोश है इसलिए मुझे पता नहीं लगा कि मैं मूल्य को संशोधित क्यों नहीं कर सकता।

जबकि Serializer.data से मूल्य वापसी वास्तव में एक शब्दकोश है, Serializer.data एक सरल उदाहरण चर नहीं है।

आप rest_framework/serializers.py को देखें, तो: OrderedDict से

class Serializer(BaseSerializer): 
    # [...] 
    @property 
    def data(self): 
     ret = super(Serializer, self).data 
     return ReturnDict(ret, serializer=self) 

ReturnDict इनहेरिट करती है, लेकिन आप अभी भी एक नई शब्दकोश आप का उपयोग Serializer.data हर बार मिलता है।

असली डेटा _data में है, लेकिन के रूप में अंडरस्कोर द्वारा नोट आप संशोधित करना है कि या तो के रूप में यह सार्वजनिक करने का इरादा नहीं है नहीं कर सकते हैं। मान Serializer.to_representation() से भरे हुए हैं जिन्हें आप विचारों पर ओवरराइड कर सकते हैं।

दूसरे भाग के लिए: ModelViewSetget_serializer() को परिभाषित करता है जिसे अनुरोध करने के लिए POST डेटा अनुरोध कहा जाता है जिसे आप संशोधित करना चाहते हैं। मैं सुझाव देता हूं कि इसके बजाय धारावाहिक बनाने के पहले इनपुट डेटा को बदलने का प्रयास करें।

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