我想对模型"product.category“使用xmlrpc。
如何用PYTHON编写带有“读取和搜索”的字段"categ_id“?我总是有一个错误。我需要这样做,因为我必须把这些信息转移到另一个数据库Odoo。
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’>
发布于 2020-07-29 00:02:15
方法名应该是朗读
示例
models.execute_kw(db, uid, password,
'product.template', 'search_read',
[],
{'fields': ['name', 'default_code', 'categ_id']})
它应该返回一个dicts列表,categ_id
字段值是两个值的列表,第一个是类别的id,第二个是类别的名称。
对于写 categ_id
,只需向write方法提供类别ID即可。
示例:
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],
...
}
])
您提到需要将数据传输到另一个数据库,产品模板可能不存在,这意味着您不能调用写方法,您可以调用创建方法。
示例:
id = models.execute_kw(db, uid, password, 'product.template', 'create', [{
'categ_id': ptd['categ_id'][0],
...
}])
编辑:
您将使用以下方法获得无效语法错误:
[product,'categ_id': product['categ_id'][0],]
要将值传递给create方法,需要将args
作为列表传递给execute_kw
方法,然后将值作为字典传递到该列表中。
编辑:
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是值,那么在创建新类别时必须传递该值。
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
发布于 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'})
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'})
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中创建任何模型时,需要传递字典。
https://stackoverflow.com/questions/63142785
复制相似问题