Zoeken…


Opmerkingen

Als u overweegt nieuwe methoden toe te voegen in Python om ze te gebruiken in RPC van JavaScript, overweeg dan de volgende opties van methode-decorateurs: als u te maken hebt met id's / recordsets, kies dan voor de definitie van de python-methode decorateur:

  • @ api.multi - om recordset in uw methode te krijgen
  • @ api.one - om browse_records één voor één in uw methode in bovenstaande voorbeelden te krijgen, wordt @ api.multi gebruikt, maar @ api.one kan ook worden gebruikt om met id's om te gaan, afhankelijk van de vereisten (het wordt echter sterk aanbevolen om @ te gebruiken api.multi in plaats van @ api.one om prestatieredenen).

Of als het een eenvoudige functie is die niet te maken heeft met records / id's, kies dan voor de python-methode decorateur:

  • @ api.model - Staat beleefd toe met API in oude stijl.
  • @ api.multi - Nogmaals, u kunt het hier ook gebruiken, geef gewoon [ ] (lege array) door als eerste argument in javascript ...

Referenties: Odoo RPC-documentatie , decorateurs van de Odoo 8 API-methode

Een voorbeeld van een Odoo-model om methoden uit te roepen

class my_model(models.Model):
    _name = "my.model"

    name = fields.Char('Name')

    @api.multi
    def foo_manipulate_records_1(self):
        """ function returns list of tuples (id,name) """
        return [(i.id,i.name) for i in self]

    @api.multi
    def foo_manipulate_records_2(self, arg1, arg2)
        #here you can take advantage of "self" recordset and same time use aditional arguments "arg1", "arg2"
        pass

    @api.model
    def bar_no_deal_with_ids(self, arg1, arg2):
        """ concatenate arg1 and arg2 """
        return unicode(arg1) + unicode(arg2)

Odoo RPC-voorbeelden

De onderstaande voorbeelden laten zien hoe de Python-functie vanuit JavaScript in Odoo 8 wordt aangeroepen . In de voorbeelden noemen we methoden van my_model die eerder op deze pagina zijn beschreven.
We nemen aan dat in de volgende voorbeelden de variabele "list_of_ids" een lijst (array) bevat van id's van bestaande records van het "my.model" -model.

  • Aanroep van methode foo_manipulate_records_1 versierd met @ api.multi :
    new instance.web.Model("my.model")
        .call( "foo_manipulate_records_1", [list_of_ids])
            .then(function (result) {
                // do something with result
        });

  • Aanroep van methode foo_manipulate_records_2 versierd met @ api.multi :
    new instance.web.Model("my.model")
        .call( "foo_manipulate_records_2", [list_of_ids, arg1, arg2])
            .then(function (result) {
                // do something with result
        });

  • Aanroep van methode bar_no_deal_with_ids versierd met @ api.model :
    new instance.web.Model("my.model")
        .call( "bar_no_deal_with_ids", [arg1, arg2])
            .then(function (result) {
                // do something with result
        });

Ook als het enige betekenis heeft, afhankelijk van de implementatie, kun je de functie gedecoreerd met @ api.multi aanroepen, zelfs als je niet te maken hebt met ids (geef gewoon een lege array door in plaats van ids, als eerste element van de argumentlijst):

    new instance.web.Model("my.model")
        .call( "foo_manipulate_records_2", [[], arg1, arg2])
            .then(function (result) {
                // do something with result
        });

op deze manier kan in sommige gevallen handig zijn, omdat de functie zonder decoratie in v8.0 api wordt beschouwd als @ api.multi (omdat @ api.multi een standaarddecorateur is)

Cxcept van twee parameters voor RPC-aanroep die in de bovenstaande voorbeelden worden gebruikt (de functienaam en de argumentenlijst), kunt u de derde parameter gebruiken - een woordenboek met trefwoordargumenten . Het wordt ten zeerste aanbevolen om een context om te draaien (in sommige gevallen kan dit zelfs nodig zijn), omdat dit het gedrag van een externe procedure kan veranderen (lokalisatie, enz.). Zie hieronder het voorbeeld met contextargument in RPC-aanroep (hetzelfde kan worden toegepast op alle bovenstaande voorbeelden)

var self = this;
new instance.web.Model("my.model")
    .call("foo_manipulate_records_2", [[], arg1, arg2], {'context':self.session.user_context})
        .then(function (result) {
            // do something with result
    });

Natuurlijk kunt u ook aangepaste context gebruiken, indien nodig, in plaats van de bestaande om te draaien zoals in dit voorbeeld.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow