OpenERP - 将数据复制到不同表的新记录中 - 费用/采购单
我一直在尝试把hr_expenses表单中的某些字段复制到我自己创建的模块purchase_orders里。
下面这个方法是为了让我在扩展的hr_expenses.py文件中实现这个功能而写的:
def po_generator(self, cr, uid, ids, arg, context=None):
res = {}
for expense in self.browse(cr, uid, ids, context=context):
expense_line = self.pool.get('hr.expense.line')
purchase_orders = self.pool.get('purchase.orders')
for line in expense.line_ids:
expense_line_record = expense_line.search(cr, uid, [('id', '=', line.id)], context=context)
# pdb.set_trace()
purchase_orders.create(cr, uid,
{
'submitted_employee_name':expense.employee_id,
'dateofexpense':expense_line.date_value,
'project_id_expense':expense_line.project_id,
'Description':expense_line.name,
'netamount':expense_line.product_exc_VAT,
'raised_employee_name':expense.employee_id,
'project_id_account_type':expense_line.project_id_account_type,
},
context
)
return res
但是,当我尝试执行这段代码时,OpenERP给我报了一个'AttributeError'错误,错误信息如下:
文件 "/opt/openerp/custom_modules/legacy_expense_po/legacy_expense.py", 第121行,在po_generator中 'dateofexpense':expense_line.date_value, AttributeError: 'hr.expense.line'对象没有'date_value'这个属性
我猜这可能和Expenses表单中的line_ids字段有关。我想获取line_ids中的每一行,并把这些作为新记录输入到purchase_orders表中。
谢谢。
1 个回答
@Sagar Mohan
你在这里犯了一个非常基础的错误。
你已经在通过某个语句循环浏览记录了。
for line in expense.line_ids:
当你说 expense.line_ids
时,这已经会拉取所有相关的记录,你不需要再通过写 expense_line_record = expense_line.search(cr, uid, [('id', '=', line.id)], context=context)
这样的语句去搜索。你要知道,在v7版本中,search方法返回的只是匹配记录的整数ID,而不是 recordset
或者 browse record
。
正确的代码是:
def po_generator(self, cr, uid, ids, arg, context=None):
res = {}
purchase_orders = self.pool.get('purchase.orders')
for expense in self.browse(cr, uid, ids, context=context):
expense_line = self.pool.get('hr.expense.line')
purchase_orders = self.pool.get('purchase.orders')
for line in expense.line_ids:
purchase_orders.create(cr, uid,
{
'submitted_employee_name':line.employee_id.name,
'dateofexpense': line.date_value,
'project_id_expense': line.project_id.id,
'Description': line.name,
'netamount': line.product_exc_VAT,
'raised_employee_name': expense.employee_id.name,
'project_id_account_type': line.project_id_account_type,
},
context
)
return res
这段代码可能需要根据你的需求进行调整,但你可以看到,line是一个直接的浏览变量,所以你只需要用点(.)来访问字段。
还有一点要注意的是,你在循环中永远不要使用self.pool.get,这样会让你的代码变得很重。
谢谢