odoo xmlrpc的用法及实例(一)

9 篇文章 0 订阅

xlmrpc是一个odoo的外部连接API,用法如下:
写一个demo.py文件,放在d盘根目录下,代码如下:
注:以下代码引用自:https://github.com/twtrubiks/odoo-demo-addons-tutorial/tree/14.0/xml-rpc-odoo,感谢作者。

import xmlrpc.client
from pprint import pprint

# use xmlrpc 時, 建議回傳 true
# The reason is that not all client implementations of the XML-RPC protocol
# support None/Null values, and may raise errors when such a value is returned
# by a method.

url = 'http://127.0.0.1:9099'
db = 'group1'
username = 'dtcloud'
password = '123456'


def common_version():
    # provides meta-calls which don’t require authentication
    common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url))
    common.version()
    print(common.version())
    return common


def get_uid():
    # Logging in
    common = common_version()
    uid = common.authenticate(db, username, password, {})
    print('uid:', uid)
    return uid


def endpoint_object():
    #  is used to call methods of odoo models via the execute_kw RPC function.
    return xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url))


def call_check_access_rights():
    # Calling methods
    models = endpoint_object()
    uid = get_uid()
    data = models.execute_kw(db, uid, password,
                             'res.partner', 'check_access_rights',
                             ['read'], {'raise_exception': False})
    print(data)


def list_all_records():
    models = endpoint_object()
    uid = get_uid()
    # List all records
    records_data = models.execute_kw(db, uid, password,
                                     'res.partner', 'search', [[]])
    print(records_data)


def list_records():
    models = endpoint_object()
    uid = get_uid()
    # List records
    records_data = models.execute_kw(db, uid, password,
                                     'res.partner', 'search',
                                     [[['is_company', '=', True]]])
    print(records_data)


def count_records():
    models = endpoint_object()
    uid = get_uid()
    # Count records
    records_count = models.execute_kw(db, uid, password,
                                      'res.partner', 'search_count',
                                      [[['is_company', '=', True]]])
    print(records_count)


def read_records():
    models = endpoint_object()
    uid = get_uid()
    # Read records
    ids = models.execute_kw(db, uid, password,
                            'res.partner', 'search',
                            [[['is_company', '=', True]]],
                            {'limit': 1})
    print('ids:', ids)
    return ids


def read_all_field():
    models = endpoint_object()
    uid = get_uid()
    # Read records ids
    ids = read_records()
    # all field
    record = models.execute_kw(db, uid, password,
                               'res.partner', 'read', [ids])
    print('record')
    pprint(record)


def read_need_field():
    models = endpoint_object()
    uid = get_uid()
    # Read records ids
    ids = read_records()
    # need field
    record = models.execute_kw(db, uid, password,
                               'res.partner', 'read',
                               [ids], {'fields': ['name', 'country_id', 'comment']})
    print('record')
    pprint(record)


def listing_record_fields_attributes():
    models = endpoint_object()
    uid = get_uid()
    # Listing record fields attributes
    listing_record_fields = models.execute_kw(
        db, uid, password, 'res.partner', 'fields_get',
        [], {'attributes': ['string', 'help', 'type']})
    print('Listing record fields')
    pprint(listing_record_fields)


def search_and_read():
    models = endpoint_object()
    uid = get_uid()
    # Search and read
    search_and_read = models.execute_kw(db, uid, password,
                                        'res.partner', 'search_read',
                                        [[['is_company', '=', True]]],
                                        {'fields': ['name', 'country_id', 'comment'], 'limit': 5})
    print('Search and read')
    pprint(search_and_read)


def create_reads():
    models = endpoint_object()
    uid = get_uid()
    # Create records
    models.execute_kw(db, uid, password, 'res.partner', 'create', [{
        'name': "New Partner_2",
    }])

    # read Create records
    search_and_read = models.execute_kw(db, uid, password,
                                        'res.partner', 'search_read',
                                        [[['name', '=', 'New Partner_2']]],
                                        {'fields': ['name'], 'limit': 5})
    pprint(search_and_read)


def update_records():
    models = endpoint_object()
    uid = get_uid()

    # read res.partner
    search_and_read = models.execute_kw(db, uid, password,
                                        'res.partner', 'search_read',
                                        [[['name', '=', 'New Partner_2']]],
                                        {'fields': ['id'], 'limit': 1})
    my_partner_id = search_and_read[0]['id']
    print('my_partner_id:', my_partner_id)

    # Update records
    models.execute_kw(db, uid, password, 'res.partner', 'write', [[my_partner_id], {
        'name': "hello"
    }])
    # get record name after having changed it
    my_data = models.execute_kw(db, uid, password, 'res.partner', 'name_get', [[my_partner_id]])
    pprint(my_data)


def delete_record():
    # please installl sale addons
    models = endpoint_object()
    uid = get_uid()

    # read res.partner
    my_partner_id = 40

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


def many2one_create():
    # please installl sale addons
    models = endpoint_object()
    uid = get_uid()

    # read res.partner
    search_and_read = models.execute_kw(db, uid, password,
                                        'res.partner', 'search_read',
                                        [[['name', '=', 'hello']]],
                                        {'fields': ['id'], 'limit': 1})
    my_partner_id = search_and_read[0]['id']
    print('my_partner_id:', my_partner_id)

    # Many2one - create
    id_ = models.execute_kw(db, uid, password, 'sale.order', 'create', [{
        'partner_id': my_partner_id,
    }])

    # get record name after having changed it
    # check form pgadmin4
    my_data = models.execute_kw(db, uid, password, 'sale.order', 'name_get', [[id_]])
    pprint(my_data)


def many2many_add_record():
    models = endpoint_object()
    uid = get_uid()

    # res.partner.category
    # check form pgadmin4
    category_id = 7

    # res.partner
    # check form pgadmin4
    res_partner_id = 38

    # (4, id, _) links an already existing record.
    # add many2many field,
    models.execute_kw(db, uid, password, 'res.partner', 'write', [[res_partner_id], {
        'category_id': [(4, category_id, 0)]
    }])

    record = models.execute_kw(db, uid, password,
                               'res.partner', 'read',
                               [res_partner_id], {'fields': ['id', 'name', 'category_id']})
    print('record:', record)


def many2many_add_mutil_record():
    models = endpoint_object()
    uid = get_uid()

    # res.partner.category
    # check form pgadmin4
    category_ids = [6, 7]

    # res.partner
    # check form pgadmin4
    res_partner_id = 37

    # (6, _, [ids]) replaces the list of linked records with the provided list.
    # add mutil many2many field
    models.execute_kw(db, uid, password, 'res.partner', 'write', [[res_partner_id], {
        'category_id': [(6, 0, category_ids)]
    }])

    record = models.execute_kw(db, uid, password,
                               'res.partner', 'read',
                               [res_partner_id], {'fields': ['id', 'name', 'category_id']})
    print('record:', record)


def many2many_update_record():
    models = endpoint_object()
    uid = get_uid()

    # res.partner.category
    # check form pgadmin4
    category_id = 6

    # res.partner
    # check form pgadmin4
    res_partner_id = 37

    record = models.execute_kw(db, uid, password, 'res.partner', 'read',
                               [res_partner_id], {'fields': ['id', 'name', 'category_id']})
    print('record:', record)

    # update many2many field value
    # (1, ID, { values }) update the linked record with id = ID
    models.execute_kw(db, uid, password, 'res.partner', 'write', [[res_partner_id], {
        'category_id': [(1, category_id, {'name': 'hello2'})]
    }])

    record = models.execute_kw(db, uid, password,
                               'res.partner.category', 'read',
                               [category_id], {'fields': ['id', 'name']})
    print('record:', record)


def many2many_delete_record_2():
    models = endpoint_object()
    uid = get_uid()

    # res.partner.category
    # check form pgadmin4
    category_id = 6

    # res.partner
    # check form pgadmin4
    res_partner_id = 37

    record = models.execute_kw(db, uid, password,
                               'res.partner', 'read',
                               [res_partner_id], {'fields': ['id', 'name', 'category_id']})
    print('record:', record)

    # delete many2many field.
    # 2, ID) remove and delete the linked record with id = ID
    # (calls unlink on ID, that will delete the object completely,
    # and the link to it as well)
    models.execute_kw(db, uid, password, 'res.partner', 'write', [[res_partner_id], {
        'category_id': [(2, category_id, 0)]
    }])

    record = models.execute_kw(db, uid, password,
                               'res.partner', 'read',
                               [res_partner_id], {'fields': ['id', 'name', 'category_id']})
    print('record:', record)

    # res.partner.category
    # check form pgadmin4
    # id = 6 deleted

    record = models.execute_kw(db, uid, password,
                               'res.partner.category', 'read',
                               [category_id], {'fields': ['id', 'name']})
    print('record:', record)


def many2many_delete_record_3():
    models = endpoint_object()
    uid = get_uid()

    # res.partner.category
    # check form pgadmin4
    category_id = 7

    # res.partner
    # check form pgadmin4
    res_partner_id = 37

    record = models.execute_kw(db, uid, password,
                               'res.partner', 'read',
                               [res_partner_id], {'fields': ['id', 'name', 'category_id']})
    print('record:', record)

    # delete many2many field.
    # (3, ID) cut the link to the linked record with id = ID
    # (delete the relationship between the two objects
    # but does not delete the target object itself)
    models.execute_kw(db, uid, password, 'res.partner', 'write', [[res_partner_id], {
        'category_id': [(3, category_id, 0)]
    }])

    record = models.execute_kw(db, uid, password,
                               'res.partner', 'read',
                               [res_partner_id], {'fields': ['id', 'name', 'category_id']})
    print('record:', record)

    # res.partner.category
    # check form pgadmin4
    # id = 7 not deleted

    record = models.execute_kw(db, uid, password,
                               'res.partner.category', 'read',
                               [category_id], {'fields': ['id', 'name']})
    print('record:', record)


def many2many_delete_record_5():
    models = endpoint_object()
    uid = get_uid()

    # res.partner
    # check form pgadmin4
    res_partner_id = 38

    record = models.execute_kw(db, uid, password,
                               'res.partner', 'read',
                               [res_partner_id], {'fields': ['id', 'name', 'category_id']})
    print('record:', record)

    # delete many2many field.
    # (5, 0, 0) unlink all
    # (like using (3,ID, 0) for all linked records)
    models.execute_kw(db, uid, password, 'res.partner', 'write', [[res_partner_id], {
        'category_id': [(5, 0, 0)]
    }])

    # res.partner.category
    # check form pgadmin4
    # ids not deleted
    record = models.execute_kw(db, uid, password,
                               'res.partner', 'read',
                               [res_partner_id], {'fields': ['id', 'name', 'category_id']})
    print('record:', record)


common_version()
# get_uid()
# call_check_access_rights()
# list_all_records()
# list_records()
# count_records()
# read_records()
# read_all_field()
# read_need_field()
# listing_record_fields_attributes()
# search_and_read()

# create_reads()
# update_records()
# delete_record()
# many2one_create()
# many2many_add_record()
# many2many_add_mutil_record()

# many2many_update_record()
# many2many_delete_record_2()
# many2many_delete_record_3()
# many2many_delete_record_5()

将odoo服务跑起来,然后在pycharm里新建一个终端,用来模拟一个新的连接:在这里插入图片描述
放开demo.py文件中的.common_version()行,
在终端中执行:python demo.py
成功运行结果:在这里插入图片描述
参考文档及视频:
代码:https://github.com/twtrubiks/odoo-demo-addons-tutorial/tree/14.0/xml-rpc-odoo
视频(第一部分):https://www.bilibili.com/video/BV1ku411q71w?spm_id_from=333.337.search-card.all.click&vd_source=9d26123ecaa9aaac82bd7702e93b5a8d
视频(第二部分)
https://www.bilibili.com/video/BV1k3411p7ow?spm_id_from=333.337.search-card.all.click&vd_source=9d26123ecaa9aaac82bd7702e93b5a8d

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值