수색…


비고

파이썬에서 새로운 메소드를 추가하여 JavaScript에서 RPC에 사용하려는 경우 메소드 장식 자의 다음 옵션을 고려하십시오. ids / 레코드 세트를 처리해야한다면 파이썬 메소드 정의에서 데코레이터를 선택하십시오.

  • @ api.multi - 메서드에서 레코드 세트 를 가져 오는 방법
  • @ api.one - 위의 예제에서 메소드에서 browse_records를 하나씩 얻으려면 @ api.multi가 사용되지만 @api.one도 요구 사항에 따라 ID를 처리하는 데 사용될 수 있습니다 (그러나 @ 성능상의 이유로 @ api.one 대신 api.multi).

또는 레코드 / ID를 처리 할 필요가없는 간단한 함수라면 python 메서드로 데코레이터를 선택하십시오.

  • @ api.model - 예전 스타일의 API로 예의 바르게 처리 할 수 ​​있습니다.
  • @ api.multi - 다시 말하지만 여기에서도 사용할 수 있습니다. 자바 스크립트에서 첫 번째 인수로 [ ] (빈 배열)을 전달하십시오.

참고 자료 : Odoo RPC 문서 , Odoo 8 API 메소드 데코레이터

메서드를 호출하는 예제 Odoo 모델

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 예제

아래 예제는 Odoo 8의 JavaScript에서 Python 함수를 호출하는 방법을 보여줍니다.이 예에서이 페이지의 초기에 설명 된 my_model의 메서드를 호출합니다.
다음 예제에서 "list_of_ids"변수에는 "my.model"모델의 기존 레코드 ID 목록 (배열)이 들어 있다고 가정합니다.

  • @ api.multi로 장식 된 foo_manipulate_records_1 메소드 호출 :
    new instance.web.Model("my.model")
        .call( "foo_manipulate_records_1", [list_of_ids])
            .then(function (result) {
                // do something with result
        });

  • @ api.multi로 장식 된 메소드 foo_manipulate_records_2 호출 :
    new instance.web.Model("my.model")
        .call( "foo_manipulate_records_2", [list_of_ids, arg1, arg2])
            .then(function (result) {
                // do something with result
        });

  • @ api.model로 장식 된 bar_no_deal_with_ids 메소드 호출 :
    new instance.web.Model("my.model")
        .call( "bar_no_deal_with_ids", [arg1, arg2])
            .then(function (result) {
                // do something with result
        });

또한 구현에 따라 의미가있는 경우, id를 처리하지 않아도 @ api.multi로 장식 된 함수를 호출 할 수 있습니다 (인수 목록의 첫 번째 요소 인 ID 대신 빈 배열 전달).

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

v8.0 API의 장식되지 않은 함수는 @ api.multi로 간주되므로 (api.multi가 기본 데코레이터이므로)이 방법은 일부 경우에 유용 할 수 있습니다.

위의 예제 (함수 이름과 인수 목록)에서 사용되는 RPC 호출에 대한 두 개의 매개 변수를 사용하면 세 번째 매개 변수 인 키워드 인수 사전을 사용할 수 있습니다. 문맥을 돌아서는 것이 좋습니다 (경우에 따라서는 필요할 수도 있습니다). 원격 절차 (현지화 등)의 동작이 변경 될 수 있으므로 상황을 바꿀 것을 적극 권장합니다. RPC 호출에서 컨텍스트 인수를 사용하여 아래 예제를 참조하십시오 (위의 모든 예제에 동일하게 적용될 수 있음)

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
    });

물론이 예제 에서처럼 기존 컨텍스트를 뒤집는 대신 필요한 경우 사용자 지정 컨텍스트를 사용할 수도 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow