如何按 odoo 12 中的其他列过滤列?

How to filter column by other column in odoo 12?

我尝试根据另一个 "itemsnames" 字符类型的列中已经存在的名称来过滤具有 many2one 类型的 "item" 列,但我无法将域写入xml 文件,这是我的 xml 文件:

<record id="sale_order_line_form_inherited" model="ir.ui.view">
            <field name="name">sale_order.line.form.inherited</field>
            <field name="model">sale.order</field>
            <field name="inherit_id" ref="sale.view_order_form"/>
            <field name="arch" type="xml">
                <xpath expr="//tree//field[@name='name']" position="after">
                    <field name="categorie"/>
                    <!--<field name="item" domain="[('item.name','=', 'name.name')]"/>-->
                    <!--<field name="item" domain="[('item.name','in',items)]"/>-->
                    <field name="item" domain="[('item.name','in',itemsnames)]"/>
                    <field name="itemsids"/>
                    <field name="itemsnames"/>
                </xpath>
            </field>
        </record>

这里是 python 文件:

class class2(models.Model):
    _name = 'module.item'
    name = fields.Char(string='item')


class class3(models.Model):
    _name = 'module.categorieitem'
    name = fields.Many2one('module.categorie', string='Categorie')
    item = fields.Many2one('module.item', string='Item')


class class4(models.Model):
    _inherit = 'sale.order.line'
    categorie = fields.Many2one('module.categorie')

    # list1=[1,2]
    # item = fields.Many2one('module.item', domain=[('id', '=', list1)])
    item = fields.Many2one('module.item')
    itemsids = fields.Char()
    itemsnames = fields.Char()

    @api.onchange('categorie')
    def _onchange_categorie(self):
        print('»»» call onchange_categorie')
        res = {}
        items_ids = []
        items_names = []
        records = self.env['module.categorieitem'].search([('name','=',self.categorie .id)])
        for record in records:
            print(record.item.name)
            items_ids.append(record.item.id)
            items_names.append(record.item.name)
        self.itemsids = items_ids
        self.itemsnames = items_names
        print('itemsnames: ',self.itemsnames)
        res['domain'] = {'item':[('id','in',items_ids)]}
        return res

这里是截图供查看

对我来说这似乎是一个转换问题。

您正在将 itemsnames 声明为 char,

class class4(models.Model):
  ...
  itemsnames = fields.Char()

即使 items_names 类型是列表

items_names = []
...
items_names.append(record.item.name)

当您将 list 分配给 Char 字段时,必须进行类型转换。因此,self.itemsnames 获取列表的字符串表示形式,而不是列表。

self.itemsnames = items_names

然后你使用 itemsnames 就好像它有一个数组,而它没有

domain="[('item.name','in',itemsnames)]

我可以建议在 itemsnames 中存储 JSON 表示 items_names 吗?所以你可以稍后再得到一个列表。 Python 代码可能类似于:

import simplejson as json
...
class class4(models.Model):
  ...
  def _onchange_categorie(self):
    ...
    self.itemsnames = jsons.dumps(items_names)

  @property  
  def items_names_list(self):
    return json.loads(self.itemsnames)

并将域更改为

domain="[('item.name','in',items_names_list)]

编辑以解决 Invalid field 异常:

还有更多问题:

  1. 当使用 Many2one 字段时,字段名称必须以 _id 结尾,否则 Odoo 将不会生成 table 来存储数据库中的关系。
  2. item(现在 item_id)是一个字段,但 item.name 不是。您需要使用相关字段才能在此模型中获得该信息(参见 https://www.odoo.com/documentation/12.0/reference/orm.html#related-fields
  3. items_names_list 已被定义为 class 属性 因此,在您的 class 中,它必须被称为 self.items_names_list

所以,试试像这样的东西:

class class4(models.Model):
  ...
  item_id = fields.Many2one('module.item', domain="[('item_name','in',self.items_names_list)]")
  item_name = fields.Char(related="item_id.name", store=False)

皮洪class:

class class4(models.Model):
    _inherit = 'sale.order.line'
    categorie = fields.Many2one('module.categorie')

    # list1=[1,2]
    # item = fields.Many2one('module.item', domain=[('id', '=', list1)])
    item = fields.Many2one('module.item', domain="[('item.name','in',items_names_list)]")
    itemsids = fields.Char()
    itemsnames = fields.Char()

    @api.onchange('categorie')
    def _onchange_categorie(self):
        print('»»» call onchange_categorie')
        res = {}
        items_ids = []
        items_names = []
        records = self.env['module.categorieitem'].search([('name','=',self.categorie .id)])
        for record in records:
            print(record.item.name)
            items_ids.append(record.item.id)
            items_names.append(record.item.name)
        self.itemsids = items_ids
        self.itemsnames = items_names
        print('itemsnames: ',self.itemsnames)
        # res['domain'] = {'item':[('id','in',items_ids)]}
        # @added
        res['domain'] = {'item':[('id','in',items_ids)]}

        return res

    # @added
    @property
    def items_names_list(self):
        return json.loads(self.itemsnames)

class 销售控制器(http.Controller):

@http.route('/rounds/details', type='http', auth="public", website=True)
def pos_details_json(self):
    rounds = http.request.env['sale.order.line'].search([])
    my_list = []
    for data in rounds:
        my_list.append({'Line Name': data.item.name})

    return json.dumps(my_list)