Odoo 8 什么是相互参考创建记录的最佳方式
Odoo 8 what is best way to create records with reference to each other
在我创建了一个将外部产品类别导入我的 odoo 数据库的方法之后,我观察到,orm 模型的创建方法需要很多时间,当我像这样循环引用彼此时:
@api.multi
def action_confirm_site(self):
account = self
ebay_site = self.env['ebay.sites'].browse(account.site.id)
call_data = dict(LevelLimit=3, DetailLevel='ReturnAll', CategorySiteID=ebay_site.ebay_id)
error_msg = 'Cant get the Site Categories for site %s' % account.site
reply = self.call(account, 'GetCategories', call_data, error_msg).response.reply
cat_model = self.env['product.category']
top_parent = cat_model.create({'name': account.site.name, 'type': 'ebay',
'ebay_cat_id': account.site.ebay_id}).id
ebay_categories = reply.CategoryArray.Category
cats = []
for category in ebay_categories:
cat = dict(
CategoryID=category.CategoryID,
CategoryLevel=category.CategoryLevel,
CategoryName=category.CategoryName,
CategoryParentID=category.CategoryParentID
)
cats.append(cat.copy())
cats.sort(key=lambda x: x['CategoryLevel'])
id_map = {}
for cat in cats:
# parent_id is either the DB id of the parent, or the ROOT_ID
if cat['CategoryParentID'] in id_map:
parent_id = id_map[cat['CategoryParentID']]
elif cat['CategoryParentID'] == cat['CategoryID']:
parent_id = top_parent
else:
assert False, "This should not happen if the raw data is consistent"
record = cat_model.search([('ebay_cat_id', 'in', [cat['CategoryID']])]).id
if record:
id_map[cat['CategoryID']] = record
continue
record = cat_model.create({'name': cat['CategoryName'], 'type': 'ebay', 'parent_id': parent_id,
'ebay_cat_id': cat['CategoryID']}).id
id_map[cat['CategoryID']] = record
return
这需要很多时间,在这种情况下,抓取 6 级 Ebay 类别和 16651 个类别是不可用的。
我读过前端的导入方法可以传递外部引用。
在我的例子中,像 category.CategoryParentID 这样的外部引用使用 category.CategoryID 引用它的父级。
如何更改我的方法以在一个循环中创建记录,例如:
for category in ebay_categories
cat_model.create({'id': (reference[category.CategoryID]),'name': cat['CategoryName'], 'type': 'ebay', 'parent_id': (reference[category.CategoryParentID]), 'ebay_cat_id': category.CategoryID})
一个可能的罪魁祸首是 parent_left 和 parent_right 字段的重新计算。您可以尝试通过使用带有 'defer_parent_store_computation': True
的上下文来禁用它,然后在计算完所有类别后调用 self._parent_store_compute(cr)
。
在我创建了一个将外部产品类别导入我的 odoo 数据库的方法之后,我观察到,orm 模型的创建方法需要很多时间,当我像这样循环引用彼此时:
@api.multi
def action_confirm_site(self):
account = self
ebay_site = self.env['ebay.sites'].browse(account.site.id)
call_data = dict(LevelLimit=3, DetailLevel='ReturnAll', CategorySiteID=ebay_site.ebay_id)
error_msg = 'Cant get the Site Categories for site %s' % account.site
reply = self.call(account, 'GetCategories', call_data, error_msg).response.reply
cat_model = self.env['product.category']
top_parent = cat_model.create({'name': account.site.name, 'type': 'ebay',
'ebay_cat_id': account.site.ebay_id}).id
ebay_categories = reply.CategoryArray.Category
cats = []
for category in ebay_categories:
cat = dict(
CategoryID=category.CategoryID,
CategoryLevel=category.CategoryLevel,
CategoryName=category.CategoryName,
CategoryParentID=category.CategoryParentID
)
cats.append(cat.copy())
cats.sort(key=lambda x: x['CategoryLevel'])
id_map = {}
for cat in cats:
# parent_id is either the DB id of the parent, or the ROOT_ID
if cat['CategoryParentID'] in id_map:
parent_id = id_map[cat['CategoryParentID']]
elif cat['CategoryParentID'] == cat['CategoryID']:
parent_id = top_parent
else:
assert False, "This should not happen if the raw data is consistent"
record = cat_model.search([('ebay_cat_id', 'in', [cat['CategoryID']])]).id
if record:
id_map[cat['CategoryID']] = record
continue
record = cat_model.create({'name': cat['CategoryName'], 'type': 'ebay', 'parent_id': parent_id,
'ebay_cat_id': cat['CategoryID']}).id
id_map[cat['CategoryID']] = record
return
这需要很多时间,在这种情况下,抓取 6 级 Ebay 类别和 16651 个类别是不可用的。 我读过前端的导入方法可以传递外部引用。 在我的例子中,像 category.CategoryParentID 这样的外部引用使用 category.CategoryID 引用它的父级。 如何更改我的方法以在一个循环中创建记录,例如:
for category in ebay_categories
cat_model.create({'id': (reference[category.CategoryID]),'name': cat['CategoryName'], 'type': 'ebay', 'parent_id': (reference[category.CategoryParentID]), 'ebay_cat_id': category.CategoryID})
一个可能的罪魁祸首是 parent_left 和 parent_right 字段的重新计算。您可以尝试通过使用带有 'defer_parent_store_computation': True
的上下文来禁用它,然后在计算完所有类别后调用 self._parent_store_compute(cr)
。