首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用XMLRPC在Odoo中编写字段many2one

如何用XMLRPC在Odoo中编写字段many2one
EN

Stack Overflow用户
提问于 2020-07-28 21:08:31
回答 2查看 1.2K关注 0票数 1

我想对模型"product.category“使用xmlrpc。

如何用PYTHON编写带有“读取和搜索”的字段"categ_id“?我总是有一个错误。我需要这样做,因为我必须把这些信息转移到另一个数据库Odoo。

代码语言:javascript
运行
复制
    import xmlrpc.client
    import time
    url_db1="http://localhost:8069"
    db_1='DB_ONE'
    username_db_1='username'
    password_db_1='password'

    common_1 = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url_db1))
    models_1 = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url_db1))
    version_db1 = common_1.version()

    print("details..", version_db1)


    url_db2="http://localhost:806972"
    db_2='DB_2'
    username_db_2='myemail'
    password_db_2='mypassword'

    common_2 = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url_db2))
    models_2 = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url_db2))
    version_db2 = common_2.version()

    print("details..", version_db2)


    uid_db1 = common_1.authenticate(db_1, username_db_1, password_db_1, {})
    uid_db2 = common_2.authenticate(db_2, username_db_2, password_db_2, {})

    db_1_categories = models_1.execute_kw(db_1, uid_db1, password_db_1, 'product.category', 'search_read', [[]], {'fields':['id','name', 'parent_id']})

    total_count = 0
    for category in db_1_categories:
        print("category..", category)
        total_count +=1
        values = {}
        values['id'] = category['id']
        values['name'] = category['name']
        if category['parent_id']:
            values['parent_id'] = category['parent_id'][0]
        new_lead = models_2.execute_kw(db_2, uid_db2, password_db_2, 'product.category', 'create', [values])
print("Total Created..", total_count)

这是错误: ValidationError:(‘操作无法完成:另一个模型需要删除记录。如果可能,将其存档。\n\n模型:产品类别(product.category),约束:产品_类别_父_id_fkey’,\n‘>\n’>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-29 00:02:15

方法名应该是朗读

示例

代码语言:javascript
运行
复制
models.execute_kw(db, uid, password,
   'product.template', 'search_read',
    [],
    {'fields': ['name', 'default_code', 'categ_id']})

它应该返回一个dicts列表,categ_id字段值是两个值的列表,第一个是类别的id,第二个是类别的名称。

对于 categ_id,只需向write方法提供类别ID即可。

示例:

代码语言:javascript
运行
复制
product_template_data = [{'default_code': 'FURN_6666', 'categ_id': [8, 'All / Saleable / Office Furniture'], 'id': 23, 'name': 'Acoustic Bloc Screens'}, ...] 

for ptd in product_template_data:
    models.execute_kw(db, uid, password, 'product.template', 'write', 
        [[ptd['id']], 
        {
            'categ_id': ptd['categ_id'][0],
            ...
        }
    ])

您提到需要将数据传输到另一个数据库,产品模板可能不存在,这意味着您不能调用写方法,您可以调用创建方法。

示例:

代码语言:javascript
运行
复制
id = models.execute_kw(db, uid, password, 'product.template', 'create', [{
    'categ_id': ptd['categ_id'][0],
    ...
}])  

编辑:

您将使用以下方法获得无效语法错误:

代码语言:javascript
运行
复制
[product,'categ_id': product['categ_id'][0],]

要将值传递给create方法,需要将args作为列表传递给execute_kw方法,然后将值作为字典传递到该列表中。

编辑:

代码语言:javascript
运行
复制
values = {}
values['name'] = product['name']
values['categ_id'] = product['categ_id'][0]
...
new_lead = models_2.execute_kw(db_2, uid_db2, password_db_2, 'product.template', 'create', [values])

编辑:在新数据库中使用父类别id

当我们调用create方法时,它将创建一个新记录并返回它的ID,这可能与通过values字典传递的不同。

为了避免ValidationError,您可以使用字典,其中旧数据库中的父ID是键,新ID是值,那么在创建新类别时必须传递该值。

代码语言:javascript
运行
复制
category_ids = {}
for category in db_1_categories:
        print("category..", category)
        total_count +=1
        values = {}
        # values['id'] = category['id']
        values['name'] = category['name']
        if category['parent_id']:
            values['parent_id'] = category_ids[category['parent_id'][0]]
        category_id = models_2.execute_kw(db_2, uid_db2, password_db_2, 'product.category', 'create', [values])
        category_ids[category['id']] = category_id
票数 3
EN

Stack Overflow用户

发布于 2020-07-30 11:09:59

首先,代码中的错误

这是你的代码

db_1_products = models_1.execute_kw(db_1,uid_db1,password_db_1,'product.template','search_read',[],{‘field’:‘id’,'name',‘categ’,'type','default_code','list_price',‘网站_url’,‘存货_可用性’,'website_description'})

代码语言:javascript
运行
复制
total_count = 0
for product in db_1_products:
    print("produt..", product)
    total_count +=1
    new_lead = models_2.execute_kw(db_2, uid_db2, password_db_2, 'product.template', 'create', [product,'categ_id': product['categ_id'][0],])

打印(“创建的总数.”,total_count)

这是更新的代码。

db_1_products = models_1.execute_kw(db_1,uid_db1,password_db_1,'product.template','search_read',[],{‘field’:‘id’,'name',‘categ’,'type','default_code','list_price',‘网站_url’,‘存货_可用性’,'website_description'})

代码语言:javascript
运行
复制
total_count = 0
for product in db_1_products:
    print("produt..", product)
    total_count +=1
    new_lead = models_2.execute_kw(db_2, uid_db2, password_db_2, 'product.template', 'create', [{product,'categ_id': product['categ_id'][0]}])

打印(“创建的总数.”,total_count)

在odoo中创建任何模型时,需要传递字典。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63142785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档