2015-10-29 7 views
16

this link के संदर्भ में, मैंने Django Rest Framework में एक हाइपरलिंक्डमोडेलसेरियलाइज़र का उपयोग करने के कई उदाहरण देखे हैं। इसे कहते हैं: सिवाय इसके कि यह हाइपरलिंक का उपयोग करता रिश्ते, बल्कि प्राथमिक कुंजी से प्रतिनिधित्व करने के लिएडीआरएफ में हाइपरलिंक्ड मॉडेल सेरियलाइज़र का उपयोग करने का क्या फायदा है?

HyperlinkedModelSerializer वर्ग ModelSerializer वर्ग के समान है।

मेरा सवाल है, नियमित मॉडल सीरियलाइज़र बनाम उनका उपयोग करने का उपयोग केस/लाभ क्या है?

उत्तर

16

एकमात्र अंतर है, जैसा कि उद्धरण में शामिल है, प्राथमिक और विदेशी कुंजी को उन URL द्वारा दर्शाया जाता है जो केवल वास्तविक कुंजी मानों के बजाय उन संसाधनों को इंगित करते हैं।

लाभ यह है कि जब आप संबंधित वस्तुओं को पुनर्प्राप्त करना चाहते हैं तो आपको अपने अग्रभाग में संसाधन URL बनाना नहीं होगा।

एक और चीज पूरी तरह से घोंसला प्रस्तुतिकरण है जो आपको अपने धारावाहिक आउटपुट में संबंधित वस्तुओं को रेखांकित करने की अनुमति देती है। इसे ModelSerializer और HyperlinkedModelSerializer दोनों के साथ जोड़ा जा सकता है जब आपको लगता है कि एपीआई उपभोक्ता के पास उन्हें पुनर्प्राप्त करने के लिए अतिरिक्त अनुरोध करने के बजाय तुरंत संबंधित आइटम हैं।

नेस्टेड प्रतिनिधित्व Meta.depth विकल्प के माध्यम से या RelatedField के बजाय संबंधित मॉडल के सीरिएलाइज़र का उपयोग करके लागू किया जा सकता है।

जैसा कि @xleon ने यूआरएल का उपयोग करके अपनी टिप्पणी में कहा क्योंकि चाबियाँ अन्य डेवलपर्स के लिए आपके एपीआई को समझना आसान बनाती हैं।

+6

अच्छा जवाब, मैं केवल एक चीज जोड़ूंगा: आपके संसाधनों में हाइपरलिंक्स का उपयोग करके आपके वेब एपीआई का उपयोग करके किसी भी डेवलपर के लिए यह आसान हो जाएगा। अगर वे पूरे संसाधन यूआरआई देख सकते हैं तो उन्हें – xleon

4

हमें वेब एपीआई डिज़ाइन में इकाइयों के बीच संबंधों को लागू करने की आवश्यकता है। ऐसा करने के कई तरीके हैं (डीआरएफ दस्तावेज पर उल्लेख के रूप में):

  • प्राथमिक कुंजी का उपयोग करना।
  • इकाइयों के बीच हाइपरलिंकिंग का उपयोग करना।
  • संबंधित इकाई पर एक अद्वितीय पहचान स्लग फ़ील्ड का उपयोग करना।
  • संबंधित इकाई के डिफ़ॉल्ट स्ट्रिंग प्रस्तुति का उपयोग करना।
  • मूल प्रतिनिधित्व के अंदर संबंधित इकाई को नज़रअंदाज़ करना।
  • कुछ अन्य कस्टम प्रतिनिधित्व

HyperlinkedModelSerializer ModelSerializer से निम्नलिखित मतभेद है:

  • यह डिफ़ॉल्ट रूप से आईडी क्षेत्र शामिल नहीं है।
  • इसमें हाइपरलिंक्ड इडेंटिटीफ़िल्ल्ड का उपयोग करते हुए एक यूआरएल फ़ील्ड शामिल है।
  • रिलेशनशिप प्राथमिकKeyRelatedField के बजाय हाइपरलिंक्ड रेलेटेड फ़ील्ड का उपयोग करते हैं।

एक साधारण उदाहरण:

class UserSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = User 
     fields = ('url', 'username', 'email', 'groups') 


class GroupSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Group 
     fields = ('url', 'name') 

बैश> http -एक व्यवस्थापक: YourPassword http://127.0.0.1:8000/users/

"results": [ 
     { 
      "email": "[email protected]", 
      "groups": [ 
       "http://127.0.0.1:8000/groups/1/", 
       "http://127.0.0.1:8000/groups/2/" 
      ], 
      "url": "http://127.0.0.1:8000/users/1/", 
      "username": "admin" 
     } 
    ] 

लेकिन अगर आप

class UserSerializer(serializers.ModelSerializer): 
     class Meta: 
      model = User 
      fields = ('url', 'username', 'email', 'groups') 

बदल परिणाम होगा:

HyperlinkedModelSerializers कि ध्यान दिया जाना चाहिए की
"results": [ 
     { 
      "email": "[email protected]", 
      "groups": [ 
       1, 
       2 
      ], 
      "url": "http://127.0.0.1:8000/users/1/", 
      "username": "admin" 
     } 
    ] 
+0

को खोजने के लिए किसी दस्तावेज़ या अन्य तरीकों की आवश्यकता नहीं है, उदाहरण के लिए धन्यवाद! –

0

एक लागत है कि यह क्वेरी पैरामीटर क्योंकि निर्माण के लिए हाइपरलिंक यूआरएल फ़ील्ड का उपयोग करने के लिए अपने दृश्यपटल उपभोक्ता के लिए थोड़ा और अधिक कठिन है अपने एपीआई URL में क्वेरी पैरामीटर के माध्यम से फ़िल्टरिंग या आदेश देने का समर्थन करता है, तो है उन्हें सीधे पीके रखने के बजाय यूआरएल से पीके को पार्स करना होगा।

उदाहरण के लिए

, एक मार्ग /api/objects/12/ पर उपभोक्ता url क्षेत्र आदेश एक और अंत बिंदु पर इस वस्तु से एक प्रश्न छानने का निर्माण करने में 12 निकालने के लिए पार्स करने के लिए की आवश्यकता होगी पर एक वस्तु मानते हुए: /api/otherobjects/?object=12। कोई बड़ी समस्या नहीं है, लेकिन यदि आप बहुत सारे फ़िल्टरिंग करने की योजना बनाते हैं तो एक बमर।

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

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