【问题标题】:odoo 8 Count attachment and show in list viewodoo 8 计数附件并在列表视图中显示
【发布时间】:2021-06-16 02:05:37
【问题描述】:

我有 odoo 8。我想计算来自 ir_attachment 的附件,并将其显示在 stock.production.lot 中。这是我的 .py

class stock_production_lot(models.Model):
_inherit='stock.production.lot'

@api.multi
def get_attachment_info(self):
    for lot in self:
        so_line_ids = self.env['ir.attachment'].search([('res_id','=',lot.id)])
        for pick in so_line_ids:
            pick.count_attachment = 0
            if pick.datas_fname:
                pick.count_attachment = len(pick.datas_fname)

count_attachment = fields.Float(string='Total Attachment', compute='get_attachment_info')

这就是风景

<field name="count_attachment" />

谢谢

【问题讨论】:

  • 在您的方法中添加打印并在您的第一条消息中添加结果以提供更多信息。非常重要,当您通过 res_id 搜索 ir.attachment 时。在您的搜索中添加 res_model,因为 ir.attachment 对于 2 个不同的 res_model 可以有 2 个相同的 res_id
  • 你想用下面的代码pick.count_attachment = len(pick.datas_fname)做什么以及为什么你在ir.attachment模型中设置count_attachment字段?
  • 您确实需要更多地考虑您的代码。请添加更多详细信息,例如您要添加新字段的型号。为什么将附件记录集(搜索)命名为so_line_ids。在“正常”代码中,我期望模型sale.order.line 记录的 ID 列表。然后so_line_ids 上的第二个for 循环,为什么现在是picks?为什么对附件的计数需要浮动?你期望有一半的附件吗?

标签: odoo odoo-8


【解决方案1】:

这很难回答,因为您问题中的信息有点差。但让我试着用一个一般的例子来回答这个问题。

假设您想要计算模型 stock.picking 的所有附件(交货单、单据、收据等)。

所以你需要添加一个计算字段,它可以被存储,但是很难触发这个字段的重新计算,因为附件与记录间接相关(数据库中没有使用真正的外键)。

class StockPicking(models.Model):
    _inherit = 'stock.picking'

    attachment_count = fields.Integer(compute="_compute_attachment_count")

    @api.multi
    def _compute_attachment_count(self):
        for picking in self:
            domain = [('res_id', '=', picking.id),
                      ('res_model', '=', self._name)]
            picking.attachment_count = self.search_count(domain)

还将新字段添加到模型stock.picking 的视图中。

现在让我们假设您不仅想要选秀的附件,还想要他们的移动线。 只需“计数”它们并将该计数添加到前一个:

    @api.multi
    def _compute_attachment_count(self):
        for picking in self:
            domain = [('res_id', '=', picking.id),
                      ('res_model', '=', self._name)]
            picking_count = self.search_count(domain)
            if picking.move_lines:
                domain_move = [('res_id', 'in', picking.move_lines.ids),
                               ('res_model', '=', picking.move_lines._name)]
                picking_count += picking.move_lines.search_count(domain_move)
            picking.attachment_count = picking_count

【讨论】:

  • 感谢您的回答。我已经更新了我的帖子。问题是我想在 ir.attachment 表中的 stock.production.lot 中显示附件计数结果。我的 stock.picking 表中没有 res_id 和 res_model
【解决方案2】:

感谢您的回复。我有答案了

@api.one
def count_attachments(self):
    obj_attachment = self.env['ir.attachment']
    for record in self:
        record.count_attachment = 0
        attachment_ids = obj_attachment.search([('res_model','=',self._name),('res_id','=',record.id)])
        if attachment_ids:
            record.count_attachment = len(attachment_ids)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多