ORM API
레코드 세트
모델에 정의 된 메서드는 레코드 세트에서 실행되며, 그 레코드세트는 self 입니다.
class AModel(models.Model): _name = 'a.model' def a_method(self): # self는 처음부터 끝까지 모든 레코드 사이에 있을 수 있습니다. # database self.do_operation()
레코드 세트를 반복하면 단일 레코드의 새로운 세트("싱글톤")를 얻을 수 있습니다.
파이썬 문자열을 반복하는 것과 같이 단일 문자의 문자열을 생성합니다.
def do_operation(self): print self # => a.model(1, 2, 3, 4, 5) for record in self: print record # => a.model(1), then a.model(2), then a.model(3), ...
필드 엑세스
레코드 세트는 "Active Record" 인터페이스를 제공합니다.
모델 필드는 레코드에서 직접 읽고 쓸 수 있지만 싱글톤(단일 레코드 레코드세트)에서만 가능합니다.
필드의 값을 걸정하면 데이터베이스를 업데이트합니다.
>>> record.name Example Name >>> record.company_id.name Company Name >>> record.name = "Bob"
여러 레코드에서 필드를 읽거나 쓰려고 하면 오류가 발생합니다.
관계형 필드(Many2one, One2many, Many2many)에 엑세스 하면 필드가 설정되지 않은 경우 비어있는 레코드 세트가 항상 반환됩니다.
# 3 * len(records) database updates for record in records: record.a = 1 record.b = 2 record.c = 3 # len(records) database updates for record in records: record.write({'a': 1, 'b': 2, 'c': 3}) # 1 database update records.write({'a': 1, 'b': 2, 'c': 3})
record.name # 첫번째 엑세스는 데이터베이스에서 값을 읽습니다. record.name # 두번째 엑세스는 캐시에서 값을 가져옵니다.
for partner in partners: print partner.name # 첫번째 패스 프리페칭 'name' 과 'lang' # (또 다른 필드) 모든 'partners' print partner.lang
countries = set() for partner in partners: country = partner.country_id # 첫번째 패스는 모든 partners를 프리페치합니다. countries.add(country.name) # 첫번째 패스는 모든 countries를 프리페치합니다.
- record in set는 record(1-element의 레코드 세트 여야 함)가 set에 있는지 여부를 반환합니다. record not in set는 역 연산입니다.
- set1 <= set2 와 set1 < set2 에서 set1이 subset인지 set2가 subset인지를 반환합니다. (resp. strict)
- set1 >= set2 와 set1 > set2 에서 set1이 superset인지 set2가 superset인지를 반환합니다. (resp. strict)
- set1 | set2는 두 레코드 세트의 합집합을 반환하며, 두 레코드 세트에 합집합인 레코드를 포함하는 새 레코드 세트를 반환합니다.
- set1 & set2는 두 레코드 세트의 교집합을 반환하며, 두 레코드 세트에 교집합인 레코드만 포함하는 새 레코드 세트를 반환합니다.
- set1 - set2는 set2에 없는 set1 레코드만 포함하는 새 레코드 세트를 반환합니다.
- 제공된 조건자 함수를 만족하는 레코드만 포함하는 레코드세트를 반환합니다. 속성은 true 또는 false인 필드로 필터링 할 문자열 일 수도 있습니다.
# company가 현재 사용자인 레코드만 보관 records.filtered(lambda r: r.company_id == user.company_id) # partner가 company인 레코드만 보관 records.filtered("partner_id.is_company")
- 제공된 키 함수로 정렬 된 레코드 세트를 반환합니다. 키가 제공되지 않으면 모델의 기본 정렬 순서를 사용하십시오.
# name으로 레코드 정렬 records.sorted(key=lambda r: r.name)
- 제공된 함수를 레코드 세트의 각 레코드에 적용하고 결과가 레코드 세트인 경우 레코드 세트를 반환합니다.
# 세트의 각 레코드에 대해 두 개의 필드를 합산하는 list를 반환합니다. records.mapped(lambda r: r.field1 + r.field2)
# name 리스트를 반환합니다. records.mapped('name') # partner 레코드 세트를 반환합니다. record.mapped('partner_id') # 모든 partner bank의 합집합을 반환하며 중복 된 값은 제거됩니다. record.mapped('partner_id.bank_ids')
'Coding' 카테고리의 다른 글
ODOO 11 ::: ORM API - Environment (0) | 2018.04.27 |
---|---|
rpc (0) | 2018.04.26 |
HTTP ::: 프로토콜 구조 (0) | 2018.04.26 |
Odoo 11 ::: Snippets Pagination (0) | 2018.04.17 |
Odoo 11 ::: Fields Type에 대해 알아보자 (3) (0) | 2018.04.10 |