Как заставить работать вычисляемое поле с "store = True", когда я использую поля из другой модели? - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть поле pos_order_total в дереве контактов. Он рассчитывается точно, если store=False, но если store=True, он не рассчитывается, если я сделаю какой-нибудь POS-заказ. Так как я могу сделать эту работу с store=True

from odoo import api, fields, models

class ResPartner(models.Model):
    _inherit = 'res.partner'

    pos_order_total = fields.Monetary(
        string='POS Order Total',
        compute='_compute_pos_order_total',
        store=True)

    def _compute_pos_order_total(self):
        Order = self.env['pos.order']
        for partner in self:
            total = 0.0
            domain = [('partner_id', '=', partner.id)]
            for o in Order.search(domain):
                total += o.amount_total
            partner.pos_order_total = total

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Это еще одно решение проблемы:

class ResPartner(models.Model):
    _inherit = 'res.partner'

    pos_order_total = fields.Float(
        string='POS Order Total',
        compute='_compute_pos_order_total',
        store=True)

    pos_order_ids = fields.One2many(comodel_name='pos.order',
                                    inverse_name='partner_id',
                                    string='Pos Ordres')


    @api.one
    @api.depends('pos_order_ids')
    def _compute_pos_order_total(self):

        Order_id = self.env['pos.order'].search([('partner_id', '=', self.id)])

        for Order in Order_id:
            total = 0.0
            total += Order.amount_total
        self.pos_order_total = total
0 голосов
/ 26 апреля 2018

Теория

Взгляните на документацию Odoo для вычисляемых полей

total = fields.Float(compute='_compute_total')

@api.multi
@api.depends('value', 'tax')
def _compute_total(self):
    for record in self:
        record.total = record.value + record.value * record.tax

Как видите, вам нужно добавитьзависимости для запуска вычисляемого метода и обновления значения.В этом случае поля value и tax находятся в одной модели.Так что, если вы используете поля из той же модели или связаны с этой моделью, store=True будет работать хорошо.Поэтому вы должны связать поля отношениями, если это возможно.

Решение

В вашем случае вам нужно создать поле one2many, чтобы связать таблицы.Проверьте, работает ли для вас следующий код:

class ResPartner(models.Model):
    _inherit = 'res.partner'

    pos_order_total = fields.Float(
        string='POS Order Total',
        compute='_compute_pos_order_total',
        store=True
    )

    pos_order_ids = fields.One2many(
        string=u'POS Orders',
        comodel_name='pos.order',
        inverse_name='partner_id',
    )

    @api.multi
    @api.depends('pos_order_ids.amount_total')
    def _compute_pos_order_total(self):
        for partner in self:
            total = 0.0
            for order in partner.pos_order_ids:
                total += order.amount_total
            partner.pos_order_total = total
...