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)