0

我尝试根据另一个具有 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

这是查看的屏幕截图

看法

4

3 回答 3

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)
于 2019-04-03T09:52:06.580 回答
0

类销售控制器(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)
于 2019-04-03T11:10:51.437 回答
0

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

您声明itemsnames为 char,

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

即使items_names类型是列表

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

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

self.itemsnames = items_names

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

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

我可以建议存储在itemsnamesitems_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(now 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)
于 2019-04-03T02:51:09.550 回答