आपको वास्तव में विचारों और धारावाहिक के बीच चीजों को विभाजित करना होगा।
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 :) – Tim