如何在Odoo 14中搜索res.partner记录



我想在确认销售订单时在res.partner中的字段"电子邮件"上添加复选框。

class SaleOrderExtend(models.Model):
_inherit = 'sale.order'
def action_confirm(self):
partner = self.env['res.partner'].search(['partner_id', '=', self.partner_id])
if partner.email == '':
raise UserError(_("""Email is empty ."""))
....

但我得到了这个错误:上面的异常是以下异常的直接原因:

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/http.py", line 639, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 315, in _handle_exception
raise exception.with_traceback(None) from new_cause
IndexError: tuple index out of range

请问怎么了?谢谢

首先,您的搜索域是错误的。它应该是一个特殊逻辑运算符的列表,作为字符串和三元组(元组或具有3个值的列表(。

我现在不详细描述域语法,因为您的代码只有一个简单的错误:您的三元组应该在列表中:

self.env['res.partner'].search([('partner_id', '=', self.partner_id)])
# or as lists in list
self.env['res.partner'].search([['partner_id', '=', self.partner_id]])

其次,这种搜索不起作用,因为res.partner模型中没有partner_id字段,而self.partner_id是一个记录集,而不是ID,在搜索21个字段时需要ID。最后,你需要的是找到你正在确认的订单的合作伙伴。

您不需要搜索它,因为在本例中它已经是self的一个属性。

def action_confirm(self):
if not self.partner_id.email:
raise UserError(_("""Email is empty ."""))

一些优化提示:电子邮件地址可以是空的,甚至只有空格,因为它只是一个简单的字符串/字符字段。因此,也要考虑到这一点:

def action_confirm(self):
if not self.partner_id.email or not self.partner_id.email.strip():
raise UserError(_("""Email is empty ."""))

还有一个:一次确认多个订单是可能的,所以也要考虑一下:

def action_confirm(self):
not_valid_orders = self.filtered(
lambda o: not o.partner_id.email or not o.partner_id.email.strip())
if not_valid_orders:
raise UserError(
_("""Some orders have partners without email address"""))
class SaleOrderExtend(models.Model):
_inherit = 'sale.order'
def action_confirm(self):
if not self.partner_id.email or not self.partner_id.email.strip():
raise UserError(_("""Email is empty ."""))
....

最新更新