Как отфильтровать только выбранные записи в поле Many2many из всех остальных записей модели в odoo13 с помощью фильтра домена - PullRequest
1 голос
/ 30 мая 2020

Я делаю модель упаковки, в которой можно создавать упаковки и использовать ее в заказе на продажу, моя модель называется sale.package.

class Package(models.Model):
    _name = 'sale.package'
    _description = 'Package table'

    name = fields.Char(string='Name', required=True)
    width = fields.Float(string='Width')
    height = fields.Float(string='Height')
    length = fields.Float(string='Length')
    maximum_weight = fields.Float(string='Maximum weight')

Для использования в форме заказа на продажу , Я унаследовал модель sale.order и добавил поле Many2many в заказ на продажу, которое выбирает ранее сделанные пакеты, я также создал функцию Onchange, которая обновляет поле One2many на недавно созданной странице в том же заказе на продажу.

class SaleOrderPackage(models.Model):
    _inherit = 'sale.order'

    packs = fields.Many2many('sale.package', string='Package')
    package_lines = fields.One2many('sale.package.lines', 'line_name', string='Package Lines')

    @api.onchange('packs')
    def _onchange_packs(self):
        for rec in self:
            lines = [(5, 0, 0)]
            for line in self.packs:
                values = {
                    'name_on_line': line.name,
                    'line_width': line.width,
                    'line_height': line.height,
                    'line_length': line.length,
                    'line_maximum_weight': line.maximum_weight,
                }
                lines.append((0, 0, values))
            rec.package_lines = lines

До этого все идет нормально, мое новое требование - добавить интеллектуальную кнопку к тому же заказу на продажу, и после ее нажатия должно появиться древовидное представление выбранных пакетов в заказе на продажу. Я добавил умную кнопку и определил функцию в файле python, который возвращает не только выбранные, но и все пакеты, созданные с помощью модели.

    def selected_packages(self):
        print(self.packs)
        return {
            'name': 'Selected Packages',
            'domain': [],
            'view_type': 'form',
            'res_model': 'sale.package',
            'view_id': False,
            'view_mode': 'tree,form',
            'type': 'ir.actions.act_window'
        }

Поскольку у меня всего неделя в изучении Odoo Я не могу понять, как использовать фильтр домена в этом контексте, пожалуйста, помогите. Заранее спасибо.

1 Ответ

2 голосов
/ 30 мая 2020

Если вам нужно показать только выбранные пакеты, вам нужно просто отфильтровать записи по их id.

Используйте self.packs.ids , чтобы вернуть список фактических идентификаторов записей, соответствующих выбранным пакетам:

'domain': [('id', 'in', self.packs.ids)],
...