2016-11-26 8 views
2

Я пытаюсь выполнить поиск по вычисленному полю в Odoo 9. Но он возвращает всю запись в качестве результата.Как я могу выполнить поиск по вычисленному полю в Odoo?

class Version(models.Model): 
    _name='product_cars_application.version' 

    name = fields.Char(compute="_get_name", store=True) 

    @api.one 
    def _get_name(self): 
     self.name = "%s %s %s (%s)" % (self.brand_id, 
             self.model_id.name, 
             self.vname, 
             self.year_id) 

Я попытался с store=True и без него, но имя поля не сохраняется в Databse. Я также попытался удалить столбец «имя» из базы данных, затем я обновил модуль, но он не хранит вычисления. Вычисленное поле отлично работает в представлении формы, но имя не сохраняется и поиск не работает.

Итак, как я могу искать по названию поля?

ответ

1

Добавьте это в свой код.

def _name_search(self,name, args=None, operator='ilike', limit=100): 
    if operator == 'like': 
     operator = 'ilike' 

    versions=self.search([('name', operator, name)], limit=limit) 
    return versions.name_get() 

name = fields.Char(compute=_get_name, store=True,search=_name_search) 

Подробнее вы можете найти в документах.

https://www.odoo.com/documentation/8.0/reference/orm.html

Раздел "Компьютерные поля" для вас.

Надеюсь, он сработает. Дай мне знать.

+0

должны сделать некоторые изменения четкости _name_search (я, имя, арг = None, оператор = 'ILIKE', предел = 100): если оператор == 'как': оператор = 'ILIKE' версии = self.search ([('name', operator, name)], limit = limit) return versions.name_get() –

+0

Ok. Я изменил свой код на ваши нужды. Кто-то с той же проблемой может лучше понять, что мы здесь делали. – Nope

+0

Я не рекомендую использовать 'store = True' в вычисленных полях, потому что в некоторых случаях они плохо работают. – ChesuCR

0

Я не рекомендую использовать store=True в вычисленных полях, потому что в некоторых случаях они плохо работают. Так что, я думаю, что вы могли бы сделать что-то вроде этого:

class Version(models.Model): 
    _name = 'product_cars_application.version' 

    name = fields.Char(
     compute="_compute_name", 
     search="_search_name", 
    ) 

    @api.one 
    def _compute_name(self): 
     self.name = "%s %s %s (%s)" % (self.brand_id, 
            self.model_id.name, 
            self.vname, 
            self.year_id) 

    def _search_name(self, operator, value): 
     """ Actually this converts a domain into another one. 
      With this new domain Odoo can search well 
      A list of ids is the most easy way without computed fields 
       * [('id', 'in', id_list)] 
     """ 
     if operator == 'ilike': 
      name = self.env.context.get('name', False) 
      if name is not False: 
       id_list = [] 
       product_cars = self.env['product_cars_application.version'].search([]) 
       for car in product_cars: 
        if name in car.name: 
         id_list.append(lot.id) 
       return [('id', 'in', lot_id_list)] 
      else: 
       return [('id', 'in', [])] 
     else: 
      _logger.error(
       'The field name is not searchable' 
       ' with the operator: {}',format(operator) 
      ) 

Это неэффективно, потому что вы всегда должны перебрать все записи, но я думаю, что это единственный безопасный способ сделать это.

Кстати, для вашего конкретного случая лучше всего создать имя поля как обычный символ, который не вычисляется. Вы можете установить значение по умолчанию для создания имени. Таким образом, значение будет сохранено, и проблемы исчезнут.