如何按 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
异常:
还有更多问题:
- 当使用 Many2one 字段时,字段名称必须以
_id
结尾,否则 Odoo 将不会生成 table 来存储数据库中的关系。
item
(现在 item_id
)是一个字段,但 item.name
不是。您需要使用相关字段才能在此模型中获得该信息(参见 https://www.odoo.com/documentation/12.0/reference/orm.html#related-fields)
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)
我尝试根据另一个 "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
异常:
还有更多问题:
- 当使用 Many2one 字段时,字段名称必须以
_id
结尾,否则 Odoo 将不会生成 table 来存储数据库中的关系。 item
(现在item_id
)是一个字段,但item.name
不是。您需要使用相关字段才能在此模型中获得该信息(参见 https://www.odoo.com/documentation/12.0/reference/orm.html#related-fields)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)