2016-11-26 7 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로하고 그것없이 시도하지만, 이름 필드는, 데이타베이스에 저장되지 않습니다. 또한 데이터베이스에서 열 "name"을 삭제하려고 시도했지만 모듈을 업데이트했지만 계산을 저장하지 않습니다. 계산 된 필드를 폼보기에서 제대로 작동하지만 이름이 저장되지 않은 및 검색 작동하지 않습니다.

필드 이름으로 어떻게 검색합니까?

답변

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 (자기, 이름, 인수 = 없음, 연산자 = 'ILIKE', 한계 = 100) : 경우 연산자 == '와 같은' 연산자 = 'ILIKE' 버전 = self.search ([('name', operator, name)], 제한 = 한계) 반환 버전. 이름 _get() –

+0

확인. 내 필요에 따라 코드를 변경했습니다. 같은 문제가있는 누군가는 우리가 여기서 한 일을 더 잘 이해할 수 있습니다. – 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) 
      ) 

당신은 항상 모든 레코드를 통해 루프가 있기 때문에 그것은 비효율적이다,하지만 난 그것을 할 수있는 유일한 안전 모드라고 생각합니다.

하지만 특수한 경우에 수행 할 수있는 가장 좋은 방법은 계산되지 않은 일반 문자로 필드 이름을 만드는 것입니다. 이름을 만들려면 기본값을 설정할 수 있습니다. 이 값은 저장되고 문제는 사라질 것입니다.