आम तौर पर दोनों डेकोएटर का उपयोग रिकॉर्ड-शैली विधि को सजाने के लिए किया जाता है जहां 'self
' में रिकॉर्डसेट (ओं) शामिल हैं। जब @api.one
और @api.multi
उपयोग करने के लिए मुझे संक्षिप्त में समझाता हूँ:
1.@api.one
:
डेकोरेट एक रिकार्ड शैली विधि जहां 'स्वयं' एक सिंगलटन उदाहरण होने की उम्मीद है।
सजाया गया विधि स्वचालित रूप से रिकॉर्ड पर लूप्स (यानी, रिकॉर्ड में प्रत्येक रिकॉर्ड के लिए यह विधि कॉल करता है), और परिणाम के साथ एक सूची बनाता है।
यदि विधि @returns से सजाया गया है, तो यह परिणामस्वरूप उदाहरणों को जोड़ता है। इस तरह की एक विधि:
@ api.one डीईएफ़ विधि (स्वयं, args): वापसी self.name
दोनों रिकॉर्ड और परंपरागत शैली में कहा जा सकता है, जैसे ::
# recs = model.browse(cr, uid, ids, context)
names = recs.method(args)
names = model.method(cr, uid, ids, args, context=context)
- प्रत्येक बार 'स्वयं' को वर्तमान रिकॉर्ड के रूप में फिर से परिभाषित किया जाता है।
2.@api.multi
:
एक रिकार्ड शैली विधि जहां 'self
' एक recordset है सजाएँ। विधि आमतौर पर रिकॉर्ड पर एक ऑपरेशन परिभाषित करता है। इस तरह की एक विधि:
@ api.multi डीईएफ़ विधि (स्वयं, args):
, दोनों रिकॉर्ड और परंपरागत शैली में कहा जा सकता है की तरह ::
# recs = model.browse(cr, uid, ids, context)
recs.method(args)
model.method(cr, uid, ids, args, context=context)
जब उपयोग करने के लिए:
आप @ api.one का उपयोग कर रहे हैं, तो retu rned मूल्य एक सूची में है। यह हमेशा वेब क्लाइंट द्वारा समर्थित नहीं है, उदा। बटन एक्शन विधियों पर। उस स्थिति में, आपको @api का उपयोग करना चाहिए।अपनी विधि को सजाने के लिए बहु, और शायद विधि परिभाषा में self.ensure_one() को कॉल करें।
वापसी मूल्यों में साइड इफेक्ट से बचने के लिए @ api.one की बजाय self.ensure_one() के साथ @ api.multi का बेहतर उपयोग होता है।
उल्लेख कर सकते हैं सभी एपीआई के विस्तृत विवरण के लिए: यह डिफ़ॉल्ट व्यवहार है अंदर रिकॉर्ड "api.multi का उपयोग कब करें" बिंदु के बारे में। क्या यह मानदंड वेब क्लाइंट समर्थन पर आधारित है? सभी समस्याओं में api.return के माध्यम से इस समस्या का समाधान नहीं किया जा सकता है? मैं इस तरह से देखता हूं कि हम अर्थपूर्ण जानकारी का त्याग करते हैं जो ओआरएम के अनुकूलन करने और उचित कॉल का निर्णय लेने के लिए उपयोगी हो सकता है। मुझे लगता है कि यह अधिक से अधिक एसक्यूएल स्टेटमेंट्स की तरह है जब ओआरएम इसे सुधारने के बजाय कुछ ऑपरेशन का समर्थन नहीं करता है। – yucer
@ बॉम्बरमेन विस्तृत स्पष्टीकरण के लिए धन्यवाद! उसने मेरा रहस्य हल किया :) मैं सोच रहा था कि मुझे अपनी विधि से एक सूची क्यों मिली :) – IstaLibera
अच्छा जवाब! बस यह जोड़ना चाहते हैं कि @ api.one को v9.0 (https://www.odoo.com/documentation/10.0/reference/orm.html#module-odoo.api) से हटा दिया गया है – Fractalf