2015-01-16 8 views
9

हाल ही में odoo (पूर्व में ओपनरपी) वी 8 जारी किया गया है। नई एपीआई विधि सजावट में पेश किए जाते हैं। models.py विधियों को @api.one या @api.multi से सजाया जाना चाहिए।odoo में api.one और api.multi का उपयोग कब करें | OpenERP?

odoo documentation का जिक्र करते हुए मैं सटीक उपयोग निर्धारित नहीं कर सकता। क्या कोई विस्तार से समझा सकता है।

धन्यवाद।

उत्तर

15

आम तौर पर दोनों डेकोएटर का उपयोग रिकॉर्ड-शैली विधि को सजाने के लिए किया जाता है जहां '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) 

जब उपयोग करने के लिए:

  1. आप @ api.one का उपयोग कर रहे हैं, तो retu rned मूल्य एक सूची में है। यह हमेशा वेब क्लाइंट द्वारा समर्थित नहीं है, उदा। बटन एक्शन विधियों पर। उस स्थिति में, आपको @api का उपयोग करना चाहिए।अपनी विधि को सजाने के लिए बहु, और शायद विधि परिभाषा में self.ensure_one() को कॉल करें।

  2. वापसी मूल्यों में साइड इफेक्ट से बचने के लिए @ api.one की बजाय self.ensure_one() के साथ @ api.multi का बेहतर उपयोग होता है।

+0

उल्लेख कर सकते हैं सभी एपीआई के विस्तृत विवरण के लिए: यह डिफ़ॉल्ट व्यवहार है अंदर रिकॉर्ड "api.multi का उपयोग कब करें" बिंदु के बारे में। क्या यह मानदंड वेब क्लाइंट समर्थन पर आधारित है? सभी समस्याओं में api.return के माध्यम से इस समस्या का समाधान नहीं किया जा सकता है? मैं इस तरह से देखता हूं कि हम अर्थपूर्ण जानकारी का त्याग करते हैं जो ओआरएम के अनुकूलन करने और उचित कॉल का निर्णय लेने के लिए उपयोगी हो सकता है। मुझे लगता है कि यह अधिक से अधिक एसक्यूएल स्टेटमेंट्स की तरह है जब ओआरएम इसे सुधारने के बजाय कुछ ऑपरेशन का समर्थन नहीं करता है। – yucer

+0

@ बॉम्बरमेन विस्तृत स्पष्टीकरण के लिए धन्यवाद! उसने मेरा रहस्य हल किया :) मैं सोच रहा था कि मुझे अपनी विधि से एक सूची क्यों मिली :) – IstaLibera

+0

अच्छा जवाब! बस यह जोड़ना चाहते हैं कि @ api.one को v9.0 (https://www.odoo.com/documentation/10.0/reference/orm.html#module-odoo.api) से हटा दिया गया है – Fractalf

3

@ api.one:

यह डेकोरेटर आप के लिए पर RecordSet का रिकार्ड स्वचालित रूप से लूप। स्व मौजूदा रिकॉर्ड के रूप में नए सिरे से परिभाषित किया गया है:

@api.one 
def func(self): 
    self.name = 'xyz' 

api.multi @:

स्व यात्रा के बिना वर्तमान RecordSet हो जाएगा।

@api.multi 
def func(self): 
    len(self) 

आप जब तक मैं देख रहा हूँ विधि सज्जाकार आप कैसे कार्रवाई कर रहे हैं का अर्थ जानकारी निर्दिष्ट करने की अनुमति इस Link

0
@api.model #When the record data/self is not as relevant. Sometimes also used with old API calls. 
def model_text(self): 
    return "this text does not rely on self" 

@api.multi #Normally followed by a loop on self because self may contain multiple records 
def set_field(self): 
    for r in self: 
     r.abc = r.a + r.b 

@api.one #The api will do a loop and call the method for each record. Not preferred because of potential problems with returns to web clients 
def set_field(self): 
    self.abc = self.a + self.b 
+0

कृपया डंपिंग कोड से बचने का प्रयास करें एक उत्तर के रूप में और यह बताने की कोशिश करें कि यह क्या करता है और क्यों। आपका कोड उन लोगों के लिए स्पष्ट नहीं हो सकता है जिनके पास प्रासंगिक कोडिंग अनुभव नहीं है। – Frits

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