我已经使用One2many字段扩展了'account.analytic.account'模型,该字段使用One2many字段引用了第二个模型。如何浏览或搜索Odoo中的One2many字段?
当我尝试迭代计算方法中的第二个One2many字段时,它只列出刚刚添加的记录。在保存父记录之前,先前的记录(在界面上可见)在使用'self'上下文的代码中不可见。
例如:
for line in self.One2manyField:
#only gets here for records I add during current session, or all records if parent is saved
#how can I see previously saved records?
下面是代码:
1)扩展 'account.analytic.account' 模型
class account_analytic_account(models.Model):
_inherit = ['account.analytic.account']
service_location_ids = fields.One2many(comodel_name='contract.service.location', inverse_name='contract_id', copy=True)
2.)首先引用One2many模型:
class Contract_Service_Location(models.Model):
_name = 'contract.service.location'
_description = 'Service Location Record'
#problem is here!
#compute method for subtotal field
@api.one
@api.depends('recurring_line_ids','recurring_line_ids.price_subtotal')
def _compute_subtotal(self):
total = 0.0
#I tried to get previously saved ids, but returns nothing, until parent record is saved
old_ids = self.env['contract.recurring.line'].search([('service_location_id', '=', self.id)])
#this only works for new entries during same session, or until parent record is saved. Why?
for line in self.recurring_line_ids:
total = total + line.price_subtotal
#set field
self.price_subtotal = total
contract_id = fields.Many2one(comodel_name='account.analytic.account')
fiscal_position = fields.Many2one(comodel_name='account.fiscal.position', string='Default Taxes')
partner_id = fields.Many2one(comodel_name='res.partner', string='Service Location', help='Optional seperate billing address from customer AND service locations',required=True)
sequence = fields.Integer(string='Sequence', help="Gives the sequence order when displaying a list of sales order lines.")
price_subtotal = fields.Float(compute='_compute_subtotal', string='Subtotal', digits_compute= dp.get_precision('Account'), readonly=True, store=True)
pricelist_id = fields.Many2one(comodel_name='product.pricelist', string='Pricelist', required=True, help="Pricelist for current customer.", default=_get_default_pricelist)
recurring_line_ids = fields.One2many(comodel_name='contract.recurring.line', inverse_name='service_location_id', copy=True)
3.)第二引用One2many型号:
class Contract_Recurring_Line(models.Model):
_name = 'contract.recurring.line'
_description = 'Recurring Service Location Line'
@api.one
@api.depends('price_unit', 'discount', 'product_uom_qty','product_uos_qty',
'product_id', 'service_location_id.partner_id','service_location_id.pricelist_id')
def _compute_subtotal(self):
price = self.price_unit * (1 - (self.discount or 0.0)/100.0)
taxes = self.tax_id.compute_all(price, self.product_uom_qty, product=self.product_id, partner=self.service_location_id.partner_id)
self.price_subtotal = taxes['total']
if self.service_location_id:
self.price_subtotal = self.service_location_id.pricelist_id.currency_id.round(self.price_subtotal)
service_location_id = fields.Many2one(comodel_name='contract.service.location', required=True, ondelete='cascade', select=True)
name = fields.Text('Description', required=True)
product_id = fields.Many2one('product.product', 'Product', domain=[('sale_ok', '=', True)], change_default=True, ondelete='restrict')
price_unit = fields.Float('Unit Price', required=True, digits_compute= dp.get_precision('Product Price'))
price_subtotal = fields.Float(compute='_compute_subtotal', string='Subtotal',store=True, readonly=True, digits_compute= dp.get_precision('Account'))
product_uom_qty = fields.Float('Quantity', default=float(1), digits_compute= dp.get_precision('Product UoS'))
discount = fields.Float('Discount (%)', digits_compute= dp.get_precision('Discount'))