如何在odoo中按计算域搜索?

2024-05-21 03:51:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我不能按计算域搜索

我重写了中的“名称”字段产品.模板所以我需要按产品名称搜索

class autopart(models.Model):
_inherit = 'product.template'

@api.multi
@api.depends('item', 'car', 'model', 'dsc', 'drc', 'year', 'org')
def compute_amount(self):
    for rec in self:
        rec.name = " ".join(
            [rec.item and rec.item.name or "", rec.car and rec.car.name or "", rec.model and rec.model.name or "",
             rec.dsc and rec.dsc.name or "", rec.drc and rec.drc.name or "", rec.org and rec.org.name or "",
             rec.year and rec.year.name or ""])
def pro_search(self, operator, value):
    if operator == 'like':
        operator = 'ilike'
        print('I'am In')
    return [('name', operator, value)]

name = fields.Char(string="Name", required=False ,compute=compute_amount,search=pro_search)

Tags: orandnameorgselfsearchmodelitem
3条回答

默认情况下无法搜索计算字段,因为它们没有数据库值。在

如果计算字段的结果始终依赖于其他字段的组合,则可以在计算方法上使用@api.depends()修饰符,并将字段设置为store=True。这是最简单的方法。在

然而,在某些情况下,这是不够的,因为计算的字段结果依赖于更多的东西(即上下文(日期、语言等)。在这种情况下,你必须添加一个搜索方法,就像你在你的问题上面所做的那样。在

但是,代码中的主要问题是,返回的域再次基于代码这一部分中的name字段:

return [('name', operator, value)]

name = fields.Char(string="Name", required=False ,compute=compute_amount,search=pro_search)

这是错误的。已计算name字段,无法在其上搜索。您必须将此域转换为只搜索存储字段的域。在

与其他人已经声明的一样,您需要在字段声明中添加store=True。但是,如果在现有数据库上执行此操作,则所有记录将具有默认值或为空。这是因为ORM只是在psql表中添加一个新列,而没有插入值。在

为了填充数据库,您需要对所有记录手动调用compute_amount。在

请注意,如果您希望确保不会出现问题,则决不应更改字段声明以用于现有数据库。在

默认情况下,compute字段不存储在数据库中,store=False。如果您想搜索,那么您必须将该值存储在数据库中,所以只需设置store=True。在

name = fields.Char(string="Name", required=False ,compute=compute_amount,search=pro_search, store=True)

相关问题 更多 >