Odoo: как выполнить поиск parent_id и всех его дочерних элементов в product.category

#python #class #model #odoo

#python #класс #Модель #odoo

Вопрос:

Я хочу, чтобы, когда пользователь выбрал (через поле Many2one) категорию, мне нужно найти связанную parent_id Brands с ней категорию, чтобы добавить фильтр домена в другое поле Many2one, чтобы иметь связанные дочерние записи этих брендов. Поскольку я новичок, я не смог понять, как это сделать.

Предположим, category_id что здесь поле Many2one, пользователь выберет категорию из первых трех записей, теперь мы знаем, что пользователь хочет добавить элемент, связанный с электроникой, тогда система должна заполнить поле brand_id Many2one для брендов, связанных с электроникой (кроме All / Electronics / Brands), чтобы выбрать из последних 2 записей ниже здесь, во All / Electronics.

 All / Electronics / Personal Computers
All / Electronics / Personal Computers / Laptop
All / Electronics / Personal Computers / Desktop
... 
...
All / Electronics / Brands
All / Electronics / Brands / HP
All / Electronics / Brands / IBM
 

В этой модели есть больше брендов (данные таблицы), таких как:

 All / Foods / Brands
All / Foods / Brands / Hershey
All / Foods / Brands / Heinz
All / Foods / Brands / Oreo
...
All / Services / Brands
All / Services / Brands / IBM Garages
All / Services / Brands / Telos MNS
All / Services / Brands / Relia Quest
...
 

Мой пользовательский класс модели:

 class OrderItems(models.Model):
    _name = 'tests.orderitems'
    _description = "Tests Order Items"

    store_id = fields.Many2one('tests.stores', string="Store", ondelete='cascade')
    order_id = fields.Many2one('tests.testsorders')
    categry_id = fields.Many2one('product.category', string="Category",
                                 domain="[['complete_name', 'not like', '%Brands%']]")
    items_id = fields.Many2one('tests.storeitems', string="Item",
                               domain="[['categs_id', '=', categry_id]]")
    brand_id = fields.Many2one('product.category', string="Brand",
                               domain="[['complete_name', 'like', '%Brands%']]")
    unit_id = fields.Many2one('tests.units', string="Unit")
    quantity = fields.Integer(string="Quantity", required=True, default=1)
    rates = fields.Float(string="Rate", default=0)
    size = fields.Char(string="Size")
 

Пожалуйста, помогите, как я могу это сделать.

Ответ №1:

@SDBot, xml-код для этой конкретной модели находится здесь…

             <notebook>
                <page string="Order Items">
                    <field name="order_ids">
                        <tree editable="bottom" string="Order Items">
                            <field name="store_id"/>
                            <field name="categry_id"/>
                            <field name="items_id"/>
                            <field name="categ_name"/>
                            <field name="brand_id"/>
                            <field name="unit_id"/>
                            <field name="quantity"/>
                        </tree>
                    </field>
                </page>
            </notebook>
 

Модель, в которой добавлено поле categ_name и домен в brand_id

 class OrderItems(models.Model):
    _name = 'tests.orderitems'
    _description = "Tests Order Items"

    store_id = fields.Many2one('tests.stores', string="Store", ondelete='cascade')
    order_id = fields.Many2one('tests.testsorders')
    categry_id = fields.Many2one('product.category', string="Category",
                                 domain="[['complete_name', 'not like', '%Brands%']]")
    items_id = fields.Many2one('tests.storeitems', string="Item",
                               domain="[['categs_id', '=', categry_id]]")
    categ_name = fields.Char('Category Name', related='categry_id.complete_name')
    brand_id = fields.Many2one('product.category', string="Brand",
                               domain="[('complete_name', 'like', categ_name),('complete_name', '!=', categ_name)]")
    unit_id = fields.Many2one('tests.units', string="Unit")
    quantity = fields.Integer(string="Quantity", required=True, default=1)
    rates = fields.Float(string="Rate", default=0)
    size = fields.Char(string="Size")
 

Ответ №2:

Измените свой домен brand_id на:

 categ_name = fields.char('Category Name', related='categry_id.complete_name')
brand_id = fields.Many2one('product.category', string="Brand",
                           domain="[('complete_name', 'like', categ_name),('complete_name', '!=', categ_name)]")
 

Вот предварительный просмотр:

введите описание изображения здесь

Комментарии:

1. спасибо @SDBot, но он показывает пустой список, выбирать нечего.

2. о’кей, виноват, я обновил код, можешь попробовать? обязательно включите поле categ_name в представление (если хотите, установите для него значение невидимый).

3. спасибо за ваш интерес помочь мне… но, к сожалению, по-прежнему это не работает (по-прежнему отображается пустой список), также добавлено поле в его представлении (xml) в соответствии с требованиями. я хочу показывать только связанные бренды, когда пользователь выбрал категорию. пользователь может выбрать один из них в качестве All / Foods / Bakery, и список должен содержать дочерние записи всех / Foods / брендов. то же самое для других строк любого уровня. с уважением

4. можете ли вы показать мне свой XML-файл? я думаю, вы, возможно, добавили туда домен

5. в разделе Добавить комментарий это невозможно, я должен показать это в разделе ответов здесь.