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

时间:2019-04-02 10:10:13

标签: python xml python-3.x odoo odoo-12

我尝试根据另一个具有char类型的“ 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

这是视图的屏幕截图

view

3 个答案:

答案 0 :(得分:0)

对我来说,这似乎是一个铸造问题。

您将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中存储items_names的JSON表示形式吗?这样您以后可以再次获得列表。 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将不会生成用于在数据库上存储关系的表。
  2. item(现在为item_id)是一个字段,但item.name不是。您需要使用一个相关字段在该模型中获取该信息(请参见https://www.odoo.com/documentation/12.0/reference/orm.html#related-fields
  3. items_names_list已定义为类属性,因此在您的类中,必须将其称为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)

答案 1 :(得分:0)

pyhon类:

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)

答案 2 :(得分:0)

SalesController(http.Controller)类:

var friendArray