我想搜索依赖于其他字段的one2many字段的记录 这是我的代码,
家长班:
class SaleOrder(models.Model):
_inherit = 'sale.order'
customer_product_ids = fields.One2many('product.product',
compute='_get_partner_products')
order_line = fields.One2many('sale.order.line', 'order_id')
儿童班:
class SaleOrderLine(models.Model):
_inherit = 'sale.order.line'
order_id = fields.Many2one('sale.order')
product_id = fields.Many2one('product.product')
查看
<record id="view_ata_sale_order_form_inherit" model="ir.ui.view">
<field name="name">view.ata.sale.order.form.inherit</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<field name="partner_id" position="after">
<field name="partner_channel_id" invisible="1"/>
<field name="customer_product_ids"/>
</field>
<xpath expr="//tree/field[@name='product_id']" position="attributes">
<attribute name="domain">[('id', 'in', [rec.id for rec in parent.customer_product_ids])]</attribute>
</xpath>
</field>
</record>
默认情况下,客户可以查看定义的所有产品 在我的情况下,我需要过滤产品取决于客户选择 每个客户可以拥有不同的列表产品,或者如果他们没有分类,他们可以看到所有产品。
我尝试了上面的代码,但收到了错误:
Uncaught Error: Expected "]", got "(name)"
我猜错误来自这段代码:
<attribute name="domain">[('id', 'in', [rec.id for rec in parent.partner_product_ids])]</attribute>
我的问题,
是否有可能像上面的代码(在视图中)做python循环理解?
谢谢。
答案 0 :(得分:5)
在您的情况下,您需要使用onchange
并将动态域名返回到您的one2many字段
@api.onchange('partner')
def onchange_partner(self):
ids=search for products that have this partner
then return some thing like this {'domain': {'Many2one or One2many': [('id', 'in', ids)}}
我不会为您编写代码,因此您必须搜索onchange
并应用它。您可以找到一些信息here。
答案 1 :(得分:1)
你不能把这些代码放在那里。我会以不同的方式做到这一点:
更改添加其客户的产品型号
class Product(models.Model):
_inherit = 'product.product'
parent_id = fields.Many2one('res.partner')
然后可以更轻松地更改视图:
<attribute name="domain">[('partner_id', '=', partner_id)]</attribute>
或
<attribute name="domain">[('partner_id', '=', parent.partner_id)]</attribute>
(取决于你的product_id字段在哪里......
答案 2 :(得分:1)
Hello Mostafa和Alessandro Ruffolo
非常感谢回答我的问题:)(#抱歉迟到的回复)
我尝试过Mostafa Mohamed的解决方案,但它不会影响产品列表(它们会一直显示所有产品)。
What should onchange methods do and return?
这是我的代码,
@api.multi
def onchange_partner_id(self, part):
res = super(SaleOrder, self).onchange_partner_id(part)
domain = [('active', '=', True), ('sale_ok', '=', True)]
if part:
partner = self.env['res.partner'].browse(part)
if partner and partner.sales_channel_id:
domain.append(('sales_channel_ids', '=',
partner.sales_channel_id.id))
product_ids = self.env['product.product'].search(domain)
res.update(domain={
'order_line.product_id': ['id', 'in', [rec.id for rec in product_ids]]
})
return res
我尝试了另一种解决方案,因此我在 product.product 模型中覆盖 search_name 和搜索方法,这样就可以了。
这里是我的代码,
1)继承sale_view.xml
<xpath expr="//tree/field[@name='product_id']" position="attributes">
<attribute name="domain">[
('sales_channel_ids', '=', parent.partner_channel_id),
('sale_ok', '=', True),
('active', '=', True)
]</attribute>
<attribute name="context">{
'partner_channel_id': parent.partner_channel_id,
'partner_id': parent.partner_id,
'quantity': product_uom_qty,
'pricelist': parent.pricelist_id,
'uom': product_uom,
'company_id': parent.company_id
}</attribute>
</xpath>
和覆盖方法
2) search_name 方法:
@api.model
def name_search(self, name, args=None, operator='ilike', limit=100):
if 'partner_channel_id' in self._context:
target_domain = findDomain(args, 'sales_channel_ids')
if len(target_domain) == 1:
idx = target_domain.keys()[0]
domain = target_domain.values()[0]
if False in domain:
args.pop(idx)
return super(ProductProduct, self).name_search(name=name,
args=args,
operator=operator,
limit=limit)
3)搜索方法:
@api.model
def search(self, args, offset=0, limit=None, order=None, count=False):
if 'partner_channel_id' in self._context:
target_domain = findDomain(args, 'sales_channel_ids')
if len(target_domain) == 1:
idx = target_domain.keys()[0]
domain = target_domain.values()[0]
if False in domain:
args.pop(idx)
return super(ProductProduct, self).search(args=args,
offset=offset,
limit=limit,
order=order,
count=count)
我在这里尝试做的是当他们在上下文和域中检测到'partner_channel_id'这样['sales_channel_ids','=',False]时,我删除了该域并保留其余部分(客户没有频道可以看到所有产品,没有过滤产品。)