如何在odoo中按计算字段进行搜索?

时间:2019-04-13 09:57:21

标签: python python-3.x odoo

我无法通过计算字段进行搜索

我覆盖了product.template中要计算的名称字段,因此我需要按名称搜索产品

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)

3 个答案:

答案 0 :(得分:0)

默认情况下,计算字段store=False不存储在数据库中。如果要搜索,则必须将该值存储在数据库中,因此只需设置store=True

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

答案 1 :(得分:0)

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

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

但是,在某些情况下,这仅仅是不够的,因为计算出的字段结果取决于更多的东西(即上下文(日期,lang等)。在这种情况下,您必须像上面在问题中一样添加搜索方法。

但是,您代码中的主要问题是,返回的域还是基于该部分代码中的name字段:

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

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

这是错误的。 name字段是计算得出的,您无法在其上进行搜索。您必须将此域转换为仅在存储的字段中进行搜索的域。

答案 2 :(得分:0)

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

您需要在所有记录上手动调用compute_amount才能填充数据库。

请注意,如果您要确保没有问题,则永远不要更改用于现有数据库的字段声明。