外部API

通常、モジュールを介して内部的に拡張されます。 しかし多くの機能やデータは外部からも入手できます 外部からの分析や様々なツールとの統合のためです :ref:の reference/orm/model API の一部は XML-RPC で簡単に利用でき、さまざまな言語からアクセスできます。

重要

PHP8 以降、XML-RPC エクステンションはデフォルトでは使用できない場合があります。インストール手順については manual を参照してください。

注釈

外部 API 経由でデータにアクセスできるのは、Custom Odoo 価格プランでのみです。 外部 API へのアクセスは、One App Free または Standard プランでは利用できません。 詳細については、Odoo pricing page を参照するか、カスタマーサクセスマネージャーまでお問い合わせください。

関連項目

  • Web services <../howtos/web_services>のチュートリアル

接続

構成設定

すでにOdooサーバーがインストールされている場合は、そのパラメータを使用できます。

重要

Odoo Online インスタンス(<domain>.odoo) Om)、ユーザーは*ローカル*のパスワードなしで作成されます(あなたがOdoo Online認証システムを介してログインしている人として)。 それ自体によるものではありません Odoo Online インスタンスでXML-RPCを使用するには、使用したいユーザーアカウントにパスワードを設定する必要があります。

  • 管理者アカウントでインスタンスにログインします。

  • Settings ‣ Users & Companies ‣ Users に移動します。

  • XML-RPCへのアクセスに使用するユーザーをクリックします。

  • Action をクリックし、 Change Password を選択します。

  • New Password の値を設定し、 Change Password をクリックします。

server url はインスタンスのドメインです (例えば https://mycompany.odoo.com )、データベース名 はインスタンスの名前です (e. をクリックします。 mycompany)。 username は、Change Password 画面で表示されるように設定されたユーザーのログインです。

url = <insert server URL>
db = <insert database name>
username = 'admin'
password = <insert password for your admin user (default: admin)>

API キー

バージョン 14.0 で追加.

Odoo は api キー をサポートしており、(モジュールや設定によって) これらのキーが web サービスの操作を実行するために 必要な 場合があります。

スクリプトで API キーを使用する方法は、パスワード をキーで置き換えることです。ログインは使用中のままです。 API キーはパスワードと同じように慎重に保管する必要があります(インターフェイスを介してログインすることはできませんが)。

アカウントにキーを追加するには、 Preferences (または My Profile)に移動します。

../../_images/preferences.png

次に、 :guilabel:`Account Security`タブを開き、 :guilabel:`New API Key`をクリックします。

../../_images/account-security.png

キーの説明を入力してください この説明は、できるだけ明確で完了する必要があります: 後でキーを識別し、それらを削除するか、それらを周りに保持するかどうかを知る必要があります唯一の方法です。

Generate Key をクリックし、指定されたキーをコピーします。 このキーを慎重に保管してください: パスワードと等価です。 パスワードと同じように、システムは再びキーを取得したり表示したりすることはできません。 このキーを失った場合は、新しいキーを作成する必要があります(そしておそらく失われたキーを削除します)。

アカウントにキーが設定されたら。 :guilabel:`New API Key`ボタンの上に表示され、削除することができます。

../../_images/delete-key.png

削除されたAPIキーは元に戻すことも、再設定することもできません 新しいキーを生成し、古いキーを使用したすべての場所を更新する必要があります。

データベースのテスト

調査を簡単にするには、https://demo.odoo.com にテストデータベースを依頼することもできます。

import xmlrpc.client
info = xmlrpc.client.ServerProxy('https://demo.odoo.com/start').start()
url, db, username, password = info['host'], info['database'], info['user'], info['password']

ログイン

Odoo では、ほとんどのデータを問い合わせる前に、API のユーザーが認証される必要があります。

xmlrpc/2/common エンドポイントは、認証自体やバージョン情報の取得など、認証を必要としないメタコールを提供します。 認証しようとする前に接続情報が正しいかどうかを確認するために、最も簡単な呼び出しは、サーバーのバージョンを要求することです。 認証自体は authenticate 関数を介して行われ、ログインの代わりに認証コールで使用されるユーザー識別子 (uid) を返します。

common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url))
common.version()

結果:

{
    "server_version": "13.0",
    "server_version_info": [13, 0, 0, "final", 0],
    "server_serie": "13.0",
    "protocol_version": 1,
}
uid = common.authenticate(db, username, password, {})

呼び出し方法

2 番目のエンドポイントは xmlrpc/2/object です。execute_kw RPC関数を介してodoモデルのメソッドを呼び出すために使用されます。

execute_kw を呼び出すたびに、以下のパラメータを取ります。

  • 文字列を使うデータベース

  • ユーザ ID (authenticate を介して取得)

  • ユーザーのパスワード文字列

  • モデル名文字列は

  • メソッド名、文字列

  • 位置で渡されるパラメータの配列/リスト

  • キーワードで渡すパラメータのマッピング/ディクト (任意)

Example

例えば、res でレコードを検索します。 artner モデルでは、name とキーワードで渡された limit を使用して name_search を呼び出すことができます(最大で 10 の結果を得るために)。

models = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url))
models.execute_kw(db, uid, password, 'res.partner', 'name_search', ['foo'], {'limit': 10})

結果:

true

レコードの一覧

レコードは、 search() を介してリストとフィルタリングできます。

search() は必須の ドメイン フィルタを取得し、フィルタに一致するすべてのレコードのデータベース識別子を返します。

Example

例えば顧客企業を一覧表示するには、次のようにします。

models.execute_kw(db, uid, password, 'res.partner', 'search', [[['is_company', '=', True]]])

結果:

[7, 18, 12, 14, 17, 19, 8, 31, 26, 16, 13, 20, 30, 22, 29, 15, 23, 28, 74]

改ページ

デフォルトでは、検索は条件に一致するすべてのレコードのIDを返します。 offsetlimit パラメータは、一致したすべてのレコードのサブセットのみを取得することができます。

Example

models.execute_kw(db, uid, password, 'res.partner', 'search', [[['is_company', '=', True]]], {'offset': 10, 'limit': 5})

結果:

[13, 20, 30, 22, 29]

レコードをカウント

Rather than retrieve a possibly gigantic list of records and count them, search_count() can be used to retrieve only the number of records matching the query. It takes the same domain filter as search() and no other parameter.

Example

models.execute_kw(db, uid, password, 'res.partner', 'search_count', [[['is_company', '=', True]]])

結果:

19

注釈

他のユーザーがサーバーを使用している場合、searchsearch_count (またはその逆) を呼び出すと一貫性のない結果が得られない場合があります: 呼び出し間で保存されたデータが変更された可能性があります。

記録の読み取り

レコードデータは、 read() メソッドでアクセスできます。このメソッドは、IDのリストを取得します( Model によって返されます)。 earch())、および必要に応じて取得するフィールドのリスト。 デフォルトでは、現在のユーザが読み込むことのできるすべてのフィールドを取得します。これは膨大な量になりがちです。

Example

ids = models.execute_kw(db, uid, password, 'res.partner', 'search', [[['is_company', '=', True]]], {'limit': 1})
[record] = models.execute_kw(db, uid, password, 'res.partner', 'read', [ids])
# count the number of fields fetched by default
len(record)

結果:

121

逆に面白いと思われる分野は3つしか選べない。

models.execute_kw(db, uid, password, 'res.partner', 'read', [ids], {'fields': ['name', 'country_id', 'comment']})

結果:

[{"comment": false, "country_id": [21, "Belgium"], "id": 7, "name": "Agrolait"}]

注釈

id フィールドが要求されていない場合でも、常に返されます。

レコードフィールドの一覧

fields_get() を使用して、モデルのフィールドを検査し、どのフィールドが興味があるかを調べることができます。

大量のメタ情報(クライアントプログラムでも使用されます)を返すため、印刷前にフィルタリングする必要があります。 人間のユーザーにとって最も興味深い項目は string (フィールドのラベル) help (利用可能な場合はヘルプテキスト) と type (期待する値を知るか、レコードを更新するときに送信するか)

Example

models.execute_kw(db, uid, password, 'res.partner', 'fields_get', [], {'attributes': ['string', 'help', 'type']})

結果:

{
    "ean13": {
        "type": "char",
        "help": "BarCode",
        "string": "EAN13"
    },
    "property_account_position_id": {
        "type": "many2one",
        "help": "The fiscal position will determine taxes and accounts used for the partner.",
        "string": "Fiscal Position"
    },
    "signup_valid": {
        "type": "boolean",
        "help": "",
        "string": "Signup Token is Valid"
    },
    "date_localization": {
        "type": "date",
        "help": "",
        "string": "Geo Localization Date"
    },
    "ref_company_ids": {
        "type": "one2many",
        "help": "",
        "string": "Companies that refers to partner"
    },
    "sale_order_count": {
        "type": "integer",
        "help": "",
        "string": "# of Sales Order"
    },
    "purchase_order_count": {
        "type": "integer",
        "help": "",
        "string": "# of Purchase Order"
    },

検索して既読する

Because it is a very common task, Odoo provides a search_read() shortcut which, as its name suggests, is equivalent to a search() followed by a read(), but avoids having to perform two requests and keep ids around.

引数は search() と似ていますが、fields ( read() が指定されていない場合、一致したレコードのすべてのフィールドをフェッチします)。

Example

models.execute_kw(db, uid, password, 'res.partner', 'search_read', [[['is_company', '=', True]]], {'fields': ['name', 'country_id', 'comment'], 'limit': 5})

結果:

[
    {
        "comment": false,
        "country_id": [ 21, "Belgium" ],
        "id": 7,
        "name": "Agrolait"
    },
    {
        "comment": false,
        "country_id": [ 76, "France" ],
        "id": 18,
        "name": "Axelor"
    },
    {
        "comment": false,
        "country_id": [ 233, "United Kingdom" ],
        "id": 12,
        "name": "Bank Wealthy and sons"
    },
    {
        "comment": false,
        "country_id": [ 105, "India" ],
        "id": 14,
        "name": "Best Designers"
    },
    {
        "comment": false,
        "country_id": [ 76, "France" ],
        "id": 17,
        "name": "Camptocamp"
    }
]

Create records

create() を使用してモデルのレコードが作成されます。メソッドは単一のレコードを作成し、そのデータベース識別子を返します。

create() はフィールドを値にマッピングし、レコードを初期化するために使用します。 マッピングの引数を通して設定されていないデフォルト値を持つフィールドに対しては、 default の値が使用されます。

Example

id = models.execute_kw(db, uid, password, 'res.partner', 'create', [{'name': "New Partner"}])

結果:

78

警告

ほとんどの値の型は期待されるものですが( :class:`~odoo.fields.Integer`の整数)、 :class:`~odoo.fields.Char`または :class:`~odoo.fields.Text`の文字列)。

  • Date, DatetimeBinary フィールドは文字列値を使用します

  • One2manyMany2many は、 :meth:`write method <odoo.models.Model.write> `のドキュメントに詳述した特別なコマンドプロトコルを使用します。

Update records

Records can be updated using write(). It takes a list of records to update and a mapping of updated fields to values similar to create().

複数のレコードを同時に更新できますが、設定されている項目の値はすべて同じになります。 「計算された」更新を実行することはできません(設定される値はレコードの既存の値に依存します)。

Example

models.execute_kw(db, uid, password, 'res.partner', 'write', [[id], {'name': "Newer partner"}])
# get record name after having changed it
models.execute_kw(db, uid, password, 'res.partner', 'read', [[id], ['display_name']])

結果:

[[78, "Newer partner"]]

レコードを削除

レコードは unlink() にidを渡すことで一括で削除できます。

Example

models.execute_kw(db, uid, password, 'res.partner', 'unlink', [[id]])
# check if the deleted record is still in the database
models.execute_kw(db, uid, password, 'res.partner', 'search', [[['id', '=', id]]])

結果:

[]

検査とイントロスペクション

以前は :meth:`~odoo.models.Modelを使用していました。 ields_get`でモデルをクエリし、開始時から任意のモデルを使用しています Odooは、XML-RPC上でシステムへの問い合わせと(いくつかの制限がある)モデルとフィールドの変更を可能にする、大部分のモデルメタデータをいくつかのメタデータモデル内に格納します。

ir.model

様々なフィールドを介してOdooモデルに関する情報を提供します。

name

人が読めるモデルの説明です

model

システム内の各モデルの名前は

state

モデルが Python コード (base) で生成されたか、 ir.model レコード (manual) で生成されたかどうか

field_id

は、 One2many から ir.model.fields を介してモデルのフィールドのリストです。

view_ids

One2many to the アーキテクチャを表示 defined

access_ids

:class:`~odoo.fields.One2many`と :ref:`reference/security/acl`の関係

ir.model を使用することができます

  • (モデル上の操作の前提条件として、またはシステムの内容を調べるために)インストールされたモデルのシステムをクエリします。

  • 特定のモデルに関する情報を取得します(通常は関連するフィールドを一覧表示します)。

  • RPC上で動的に新しいモデルを作成します。

重要

  • カスタムモデル名は x_ で始まる必要があります。

  • state を指定し、manual に設定する必要があります。そうしないと、モデルは読み込まれません。

  • 新しい*メソッド*をカスタムモデルに追加することはできません。フィールドのみです。

Example

カスタムモデルは、最初はすべてのモデルで利用可能な「組み込み」フィールドのみを含みます。

models.execute_kw(db, uid, password, 'ir.model', 'create', [{
    'name': "Custom Model",
    'model': "x_custom_model",
    'state': 'manual',
}])
models.execute_kw(db, uid, password, 'x_custom_model', 'fields_get', [], {'attributes': ['string', 'help', 'type']})

結果:

{
    "create_uid": {
        "type": "many2one",
        "string": "Created by"
    },
    "create_date": {
        "type": "datetime",
        "string": "Created on"
    },
    "__last_update": {
        "type": "datetime",
        "string": "Last Modified on"
    },
    "write_uid": {
        "type": "many2one",
        "string": "Last Updated by"
    },
    "write_date": {
        "type": "datetime",
        "string": "Last Updated on"
    },
    "display_name": {
        "type": "char",
        "string": "Display Name"
    },
    "id": {
        "type": "integer",
        "string": "Id"
    }
}

ir.model.fields

Odooモデルのフィールドに関する情報を提供し、Pythonコードを使用せずにカスタムフィールドを追加できます。

model_id

Many2one to ir.model to the field belongs

name

フィールドの技術名 (read または write で使用)

field_description

フィールドのユーザー読み取り可能なラベル (例えば fields_getstring )

ttype

作成するフィールドの type

state

フィールドがPythonコード(base)で作成されたか、ir.model.fields (manual)

required, readonly, translate

フィールドに対応するフラグを有効にします。

groups

field-level access control, a Many2many to res.groups

selection, size, on_delete, relation, relation_field, domain

型固有のプロパティとカスタマイズについては、 the fields documentation を参照してください。

重要

  • カスタムモデルと同様に、state="manual" で作成された新しいフィールドのみがモデルの実際のフィールドとして有効になります。

  • 計算されたフィールドは ir.model.fields で追加できません。フィールドのメタ情報 (デフォルト、onchange) も設定できません。

Example

id = models.execute_kw(db, uid, password, 'ir.model', 'create', [{
    'name': "Custom Model",
    'model': "x_custom",
    'state': 'manual',
}])
models.execute_kw(db, uid, password, 'ir.model.fields', 'create', [{
    'model_id': id,
    'name': 'x_name',
    'ttype': 'char',
    'state': 'manual',
    'required': True,
}])
record_id = models.execute_kw(db, uid, password, 'x_custom', 'create', [{'x_name': "test record"}])
models.execute_kw(db, uid, password, 'x_custom', 'read', [[record_id]])

結果:

[
    {
        "create_uid": [1, "Administrator"],
        "x_name": "test record",
        "__last_update": "2014-11-12 16:32:13",
        "write_uid": [1, "Administrator"],
        "write_date": "2014-11-12 16:32:13",
        "create_date": "2014-11-12 16:32:13",
        "id": 1,
        "display_name": "test record"
    }
]