2015-05-23 10 views
17

मैं वर्तमान में अपने ऐप रीस्टफुल एपीआई के लिए djangorestframework को कार्यान्वित कर रहा हूं। इसके साथ खेलने के बाद, मैं अभी भी स्पष्ट रूप से समझ नहीं पा रहा हूं कि .create(self, validated_data) और .update(self, validated_data) धारावाहिक में उपयोग किया जाता है। जैसा कि मैं समझता हूं, सीआरयूडी केवल viewsets.ModelViewSet: create(), retrive(), update(), और destroy() में 4 मुख्य विधियों को कॉल करता है।djangorestframework serializer में कॉल और अद्यतन कब बनाए जाते हैं?

मैं भी पहले से ही डिबग करने की कोशिश की और सामान का प्रिंट आउट को देखने के लिए जब .create() और .update() तरीकों ModelViewSet और ModelSerializer दोनों में कहा जाता है है। जाहिर है, जब मैं HTTP क्रिया करता हूं तो केवल ModelViewSet में विधियों को बुलाया जाता है। हालांकि, ModelSerializer के लिए, मुझे उन 2 विधियों में कोई कॉल नहीं दिखाई दे रही है। मैं सिर्फ यह जानना चाहता हूं कि ModelSerializer में उन तरीकों का उपयोग किस प्रकार किया जाता है क्योंकि मैं देखता हूं कि लोग उन तरीकों को धारावाहिक में बहुत अधिक ओवरराइड करते हैं।

पी/एस: मैं djangorestframework में एक नौसिखिया हूं + मेरी अंग्रेजी के लिए खेद है क्योंकि मैं मूल नहीं हूं।

धन्यवाद :)

उत्तर

50

आपको वास्तव में विचारों और धारावाहिक के बीच चीजों को विभाजित करना होगा।

serializers

Serializer एक स्टैंडअलोन वस्तु है। इसका उपयोग एक डीजेंगो मॉडल (या किसी प्रकार का पायथन डेटास्ट्रक्चर, वास्तव में) को क्रमबद्ध रूप में परिवर्तित करने के लिए किया जाता है, और दूसरी तरफ। आप जहां भी चाहें इसका उपयोग कर सकते हैं। जब तक आपको अपने आउटपुट में यूआरआई की आवश्यकता नहीं होती है तब तक इसे वास्तविक HTTP अनुरोध की भी आवश्यकता नहीं होती है।

ModelSerializer सबक्लास एक विशेष प्रकार का Serializer है जो "लोड-से-मॉडल" और "सेव-टू-मॉडल" कार्यक्षमता जोड़ता है। "सेव-टू-मॉडल" प्रविष्टि बिंदु save() विधि है। आसान ओवरराइडिंग के लिए, इसका डिफ़ॉल्ट कार्यान्वयन इसके काम को create() या update() सीरियलाइज़र के तरीके से प्रस्तुत करेगा, इस पर निर्भर करता है कि यह एक नया मॉडल उदाहरण बना रहा है या एक अपडेट कर रहा है।

इसका उद्देश्य अनुकूलन है: यह आपको डेवलपर, केवल विधि बनाने, अद्यतन विधि या सामान्य व्यवहार को ओवरराइड करने का विकल्प देता है।

def save(self, **kwargs): 
    # Will be done on every save 
    kwargs['last_changed'] = timezone.now() 
    return super().save(**kwargs) 

def create(self, instance, data): 
    # Will only be done if a new object is being created 
    data['initial_creation'] = timezone.now() 
    return super().create(instance, data) 

एक बुनियादी उदाहरण है कि: उदाहरण के लिए, यह आप चीजों को इस तरह का करने के लिए अनुमति देता है। वहां, last_changed फ़ील्ड प्रत्येक ऑब्जेक्ट को सहेजने पर सेट किया जाएगा, चाहे वह एक सृजन या अद्यतन हो। एक sidenote के रूप में, आप शायद ऐसा नहीं करना चाहते हैं। "Last_changed" फ़ील्ड को सेट करने जैसी चीजें दृश्य में रहनी चाहिए, न कि धारावाहिक में।

Viewsets

एक पूरी तरह से अलग जगह में, Django बाकी ढांचे की आपूर्ति Viewsets। वे एक मॉडल के लिए एक सीआरयूडी एपीआई लागू करने के आसपास घूमते हुए विचारों का संगठित संग्रह हैं। इस तरह, यह विधियों को एक विधि, अर्थात् create(), retrieve()/list(), update() और delete() में कार्यक्षमता को संरचित करता है।

मुख्य बिंदु यह है: विचारसेट की create() विधि और धारावाहिक के create() विधि के बीच कोई कनेक्शन नहीं है।

यह सिर्फ viewset के तरीकों के डिफ़ॉल्ट कार्यान्वयन एक ModelSerializer का उपयोग करता है और कहा कि ऐसा होता है कि serializer के save() विधि प्रतिनिधियों के डिफ़ॉल्ट कार्यान्वयन विधियों एक ही नाम है कि करने के लिए काम किया है।

वैसे, last_changed उदाहरण के बारे में, आपके द्वारा ध्यान में रखते हुए यह करना होगा:

def perform_create(self, serializer): 
    now = timezone.now() 
    serializer.save(initial_creation=now, last_changed=now) 

def perform_update(self, serializer): 
    serializer.save(last_changed=timezone.now()) 

कि कार्यात्मक ऊपर के उदाहरण के बराबर है, लेकिन viewset में रहती है।

निष्कर्ष

तो अपने प्रश्न के लिए वापस, विशिष्ट बात आप ओवरराइड करना चाहिए पर निर्भर करता है वस्तु कार्य आप जोड़ना चाहते हैं के लिए जिम्मेदार है।

  • यदि आपका कस्टम व्यवहार क्रमबद्धता प्रक्रिया का हिस्सा है, कि है, कच्चे डेटा एक उचित Django मॉडल में वापस परिवर्तित करने और इसे सहेजने की प्रक्रिया है, तो आप Serializer के तरीकों ओवरराइड करना चाहिए।
  • यदि दूसरी तरफ, आपका कस्टम व्यवहार आपके विचारों के लिए विशिष्ट है, तो आपको Viewset के तरीकों को ओवरराइड करना चाहिए।

एक संकेत के रूप में, आप अपने आप से निम्नलिखित प्रश्न पूछ सकते हैं: यदि मैं एक ही स्थान पर एक ही धारावाहिक का उपयोग करता हूं (शायद एक और विचार), तो क्या यह हमेशा उस व्यवहार को प्रदर्शित करना चाहिए?

+1

उत्तर के लिए धन्यवाद! यह वास्तव में विस्तृत और गहराई से है जो मैं चाहता हूं। +1 :) – Tim

3

बाकी-api डिजाइन में, बनाने, पढ़ने, अद्यतन और हटाना एक मानक है। बनाने और अपडेट करने में काफी अंतर नहीं है।

this देखें और

देख create() विधि किसी आइटम को बनाने देगा।

और

update() विधि है जो आइटम अद्यतन करने की निर्दिष्ट करने के लिए की जरूरत है।

+0

उन 2 के बीच क्या अंतर है? – Tim

13

मैं अंत में समझ कैसे Serializer में .create() और .update() काम (विशेष रूप से ModelSerializer) और कैसे वे Viewsets (विशेष रूप से ModelViewSet) से जुड़े हैं। अगर कोई इस प्रश्न पर आता है तो मैं अवधारणा को और स्पष्ट रूप से स्पष्ट करना चाहता हूं।

असल में, 4 तरीकों CRUD ModelViewSet में: .create(), .retrieve(), .update(), और .destroy() HTTP क्रियाओं से कॉल को संभाल लेंगे। डिफ़ॉल्ट रूप से, 0Vऔर .update() ModelViewSet से .create() और .update() को मॉडलसेरियलाइज़र से बेससेरियलाइज़र क्लास से .save() विधि को कॉल करके कॉल करेगा।

बचाने() विधि तो निर्धारित करेगा कि क्या यह निर्धारित करता है कि वस्तु self.instance मौजूद है या नहीं द्वारा ModelSerializer में .create() या .update() कॉल करेंगे।

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