Динамический домен для поля Many2one на основе поля другой модели - PullRequest
1 голос
/ 06 июня 2019

У меня есть поле Many2one внутри модели, которая принадлежит отношению "One2many", и я хочу, чтобы это поле разрешало только те записи, которые удовлетворяют некоторым условиям на основе связанной модели.Как мне это сделать?

Я использую odoo 9 , и моя проблема заключается в следующем:

У меня есть модель, которая содержит два поля:

  1. Many2one: для категории продукта.

  2. One2many: для модели, представляющей продукт с соответствующей комиссией.

Идея заключается в том, что у партнера может быть список товаров, разрешенных к продаже, сгруппированных по категориям.А внутри каждой категории вы сможете составить список продуктов, принадлежащих к этой категории, и назначить каждому продукту индивидуальное значение комиссии.

Я полагаю, что я должен использовать домен для фильтрации продуктов, которые соответствуют этой категории, ноЯ не могу применить фильтр, основанный на поле "родительской" модели.

Это часть кода, который у меня есть.Пожалуйста, извините за любое несоответствие имени переменной, так как мой код частично на испанском, и я перевел его на ходу.Мои попытки решения не включены, поэтому вы должны иметь возможность работать с кодом помощи по своему усмотрению.

class allowed_products(models.Model):
  _name = 'products.allowed'

  categ_id = fields.Many2one(comodel_name='product.category', string='Product category', required=True)
  products_and_commissions = fields.One2many(comodel_name='product.commission',
    inverse_name='allowed_list_id', string='Products and their commissions')

  partner_id = fields.Many2one(comodel_name='res.partner')

Ниже приведен класс, содержащий продукт с соответствующей комиссией (яхотите отфильтровать поле 'product_id' на основе 'category_id' из вышеуказанного класса)

class product_commission(models.Model):
  _name = 'product.commission'

  allowed_list_id = fields.Many2one(comodel_name='products.allowed')

  value = fields.Float('Commission (%)', digits=(16,2), default=30.0, required=True)

#This is the field that should be filtered by corresponding category
  product_id = fields.Many2one('product.product', string='Product', required=True)

Например:

Допустим, партнер "А" может продавать "Автомобили" (категория),После того, как я назначил категорию «Автомобили» в поле M2o, я хочу только добавить продукты «Автомобили» с соответствующими комиссиями в список продуктов-комиссий One2many.

То, что я получаю каждый раз,нефильтрованный список каждого продукта.Я прочитал несколько веток, но ни одна из них, похоже, не сработала для меня.

Любой совет будет принят с благодарностью!Спасибо <3 </p>

1 Ответ

0 голосов
/ 07 июня 2019

Я использую технику здесь, чтобы избежать обмена, потому что он не будет быть запущенным в режиме редактирования:

Допустим, что ваш товар разрешен для просмотра, выглядит так:

         <field name="categ_id"/>

         <field name="products_and_commissions">
              <tree editable="bottom">
                  <!-- show product that belong to the category if a category is selected
                       else show all product  -->
                   <field name="product_id"  domain="parent.categ_id and [('category_id','child_of', parent.categ_id)] or []" /> 
                  ....
                  ....
                  ....

Возможно, вам придется использовать onchange также, чтобы очистить поле всякий раз, когда использование меняет категорию в разрешенной модели продукта

   @api.model
   def onchange_categ_id(self):
       self.products_and_commissions = False # you can do better here by keeping some product that belong the new category
...