콘텐츠로 건너뛰기

Odoo Related Field 완전 정복: 개념부터 활용까지

Odoo의 Related 필드 완전정복: 동작 원리, 적용 시점, Studio와 Python에서 설정하는 방법 안내
2026년 3월 6일 작성자
Odoo Related Field 완전 정복: 개념부터 활용까지
Dasolo
| 아직 댓글이 없습니다

소개


Odoo 데이터 모델을 다뤄본 사람이라면, 다른 레코드로 들어가 값을 확인하는 번거로움 없이 현재 폼에서 연결된 데이터의 특정 값을 바로 보여줘야 할 때가 자주 생깁니다. Related 필드는 바로 이 필요를 선언적으로 해결하는 기능으로, 별도의 코드 없이도 연결된 레코드의 값을 그대로 노출할 수 있게 해줍니다.


복잡한 연산을 수행하는 계산 필드를 직접 파이썬으로 만들기보다, Related 필드는 기존 관계 필드 체인을 따라가 최종 필드의 값을 그대로 읽어옵니다. 이 방식은 개발자 가이드에서 자주 추천되는 간단하면서도 강력한 도구이며, Odoo Studio를 사용하는 컨설턴트도 코딩 없이 상황별 정보를 폼에 표시할 때 활용할 수 있습니다.


이 문서는 Related 필드가 실제로 어떤 값을 다루는지, Odoo 내부에서 어떤 방식으로 동작하는지, Studio와 파이썬(모듈)에서 어떻게 생성·설정하는지, 그리고 현업에서 어떻게 활용되는지 실무 중심으로 설명합니다.

Odoo에서 Related 필드란 무엇인가


Odoo ORM 관점에서 Related 필드는 Float나 Char처럼 독립된 원시 타입이라기보다, 다른 모델의 필드를 바로 노출하는 ‘지름길’입니다. 즉 Related 필드는 점(.)으로 연결된 관계 경로를 따라가 최종 필드의 타입을 그대로 물려받아 뷰에 표시합니다.


가장 단순한 사례를 들면, 판매 주문(sale.order)은 고객을 가리키는 partner_id(Many2one)를 가집니다. 여기에 related='partner_id.country_id' 를 지정하면 주문 폼에서 고객의 국가를 바로 보여줄 수 있고, 별도의 값 복제 없이 원본 값을 그대로 노출합니다.

사용자 관점에서 Related 필드는 폼상의 다른 필드와 똑같이 보입니다. 최종 필드가 Char면 텍스트 입력으로, Many2one이면 드롭다운으로, Boolean이면 체크박스로 렌더링됩니다. 시각적 표현은 참조 대상 필드의 성격을 그대로 따릅니다.


기본적으로 Related 필드는 읽기 전용이고 데이터베이스에 저장되지 않습니다. 즉 항상 소스 레코드의 최신 값을 보여주지만, store=True로 저장하지 않는 한 도메인 필터나 DB 검색에서 바로 사용하기는 어렵습니다.


Odoo Studio에서는 폼에 새 필드를 추가할 때 Related 필드 옵션을 선택하면 됩니다. 존재하는 관계 경로를 클릭해 선택하면 Studio가 자동으로 적절한 설정으로 필드를 생성해 주므로, 컨설턴트가 코드를 쓰지 않고도 폼을 빠르게 보강할 수 있습니다.

Related 필드의 작동 원리


Odoo가 Related 필드를 읽을 때는 점으로 구분된 이름 체인을 순차적으로 따라갑니다. 체인의 중간 단계(마지막 제외)는 반드시 Many2one, One2many, Many2many 같은 관계 필드여야 하고, 마지막 필드만 임의 타입이 될 수 있습니다.


다음은 파이썬 모듈에서 Related 필드를 정의한 간단한 예시입니다.


from odoo import fields, models

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    partner_country_id = fields.Many2one(
        related='partner_id.country_id',
        string='Customer Country',
        store=True,
    )

위 예에서 Odoo는 partner_id를 따라 res.partner 레코드로 이동한 뒤 country_id 값을 읽어옵니다. 결과적으로 판매 주문에 고객 국가를 가리키는 Many2one 필드가 생기며, 원본 국가값을 그대로 반영합니다.


저장된(Related stored) 필드와 비저장 필드의 차이

가장 중요한 구분점은 저장 여부입니다. 기본값 store=False이면 Related 필드는 레코드를 읽을 때마다 계산되어 반환되며 모델 테이블에 값이 저장되지 않습니다.


store=True로 설정하면 소스 값이 바뀔 때 Odoo가 해당 값을 DB 칼럼에 써 넣습니다. 이렇게 저장된 Related 필드는 필터, 그룹화, 검색 등에 사용 가능해져 보고서와 리스트 뷰에서 훨씬 유용합니다.


대신 저장하면 DB 공간을 쓰고 소스 변경 시 업데이트 트리거가 필요합니다. Odoo는 의존성 추적으로 이를 자동 관리하지만, 데이터가 많은 모델에서는 성능 영향을 고려해야 합니다.


읽기 전용과 쓰기 가능한 Related 필드

기본적으로 Related 필드는 읽기 전용입니다. readonly=False로 설정하면 사용자가 값을 편집할 수 있고, 편집 시 그 변경이 체인을 거쳐 소스 레코드에 기록됩니다. 즉 주문 폼에서 관련 필드를 수정하면 실제로 고객 레코드가 수정되는 강력하지만 주의가 필요한 동작입니다.


쓰기 가능한 Related 필드는 의도적으로 쓰기 전달(Write-through)을 원할 때만 사용하세요. 리스트 뷰의 빠른 편집처럼 유용한 상황이 있지만, 사용자가 어떤 레코드를 수정하는지 모르면 의도치 않은 데이터 변경을 초래할 수 있습니다.


주요 필드 속성

Related 필드에서 자주 설정하는 핵심 파라미터는 다음과 같습니다.

  • related: 점으로 연결된 필드 경로(예: 'partner_id.country_id'). 이 속성은 필수입니다.
  • store: True로 설정하면 DB에 값을 저장해 필터·그룹화가 가능해집니다.
  • readonly: False로 하면 사용자가 편집할 수 있으며, 편집 내용은 소스에 기록됩니다.
  • string: 사용자에게 표시되는 레이블. 기본값은 최종 필드의 레이블을 따릅니다.
  • depends: 대개 필요하지 않습니다. Odoo가 related 체인에서 자동으로 의존성을 추론하지만 특수한 경우에만 직접 지정합니다.

Odoo ORM과의 상호작용 방식

Related 필드를 읽으면 체인의 최종 필드 값을 반환합니다. 체인 중 어느 단계가 비어 있으면(예: partner_id가 설정되지 않음) Related 필드는 False를 반환합니다. 이는 Odoo ORM의 표준 동작입니다.


Related 필드는 저장된 경우 도메인, 뷰, 리포트에서 완전히 활용됩니다. 저장되지 않은 경우 폼과 리스트에 표시는 가능하지만 DB 레벨 검색 도메인에서는 사용할 수 없고, 서버가 파이썬으로 평가할 때에만 제한적으로 동작합니다.

비즈니스 적용 사례


Related 필드는 실제 Odoo 구현 전반에 걸쳐 널리 사용됩니다. 아래는 현업에서 바로 활용할 수 있는 다섯 가지 실용 사례입니다.


CRM 및 영업: 판매 주문에서 고객 전화번호 표시

영업팀은 고객 레코드를 열지 않고도 주문 화면에서 전화번호를 확인하길 원합니다. sale.order에 related='partner_id.phone'을 추가하면 주문 폼에서 바로 전화번호를 노출할 수 있어 통화 속도가 빨라지고 개발 비용도 들지 않습니다. Odoo Studio로는 1분 내에 추가 가능한 간단한 개선입니다.


회계: 송장 라인에 회사 통화 표시

다중 회사 환경에서 회계 담당자는 송장 라인에 회사 통화를 표시해 보고를 깔끔하게 만들고 싶어 합니다. related='move_id.company_id.currency_id'처럼 두 단계 이상의 체인으로 통화를 가져올 수 있습니다. 체인이 길어질수록 성능과 유지보수 부담이 커지므로 가능한 짧게 유지하는 것이 좋습니다. 저장하면 통화별로 송장 필터링도 가능합니다.


재고: 재고 이동 라인에 상품 카테고리 표시

창고팀은 각 제품을 일일이 열어보지 않고도 재고 이동에서 상품 카테고리를 바로 보고 싶어 합니다. stock.move.line에 product_id.categ_id를 Related 필드로 추가하면 이동 라인에서 카테고리를 즉시 확인할 수 있고, store=True로 설정하면 재고 리포트에서 카테고리별 그룹화가 가능해집니다.


제조: 작업 지시 컴포넌트에 내부 코드 표시

생산 현장에서는 작업자에게 부품의 내부 참조코드를 바로 보여줘 혼동을 줄이는 것이 중요합니다. mrp.workorder 라인에서 product_id.default_code를 Related로 읽어오면 작업자가 올바른 부품을 빠르게 식별해 실수 감소에 실질적인 도움이 됩니다.


타임시트·프로젝트: 타임시트에 직원 부서 표시

프로젝트 매니저는 비용 배분을 위해 직원이 소속된 부서를 타임시트에서 바로 보고 싶어 합니다. account.analytic.line(타임시트 모델)에 related='employee_id.department_id'를 추가하면 타임시트 항목에서 부서를 보여줄 수 있고, store=True로 저장하면 프로젝트 분석에서 부서별 필터링이 가능합니다.

Related 필드 생성 및 커스터마이즈 방법


Related 필드를 모델에 추가하는 방법은 주로 세 가지가 있습니다. 운영 환경과 권한, 배포 방식에 따라 선택하세요.


Odoo Studio 사용(코드 없이)

Odoo Studio만으로 Related 필드를 추가할 수 있습니다. 절차는 간단합니다.

  1. 메인 메뉴에서 Odoo Studio를 엽니다.
  2. 필드를 추가할 폼으로 이동합니다.
  3. '필드 추가'를 클릭하고 'Related Field'를 선택합니다.
  4. 화면에서 관계 경로를 단계별로 클릭해 선택합니다.
  5. 레이블을 지정하고 저장 여부와 읽기 전용 여부를 설정합니다.
  6. 저장하고 Studio를 닫습니다.

Studio는 x_studio_ 접두사가 붙은 필드를 자동 생성하고 뷰에 배치합니다. 데이터베이스 스키마 변경을 직접 하지 않아도 되므로 컨설턴트가 폼을 빠르게 보완할 때 매우 효율적입니다.


파이썬으로 커스텀 모듈에서 정의하기

개발자는 모델 클래스에 Related 필드를 정의해 모듈화된 방식으로 배포하는 것이 권장됩니다. 버전관리와 여러 환경에 걸친 배포에 적합한 표준 방법입니다.


from odoo import fields, models

class StockMoveLine(models.Model):
    _inherit = 'stock.move.line'

    product_category_id = fields.Many2one(
        related='product_id.categ_id',
        string='Product Category',
        store=True,
    )

필드를 정의한 뒤에는 관련 뷰 XML에 추가해 인터페이스에 표시되도록 합니다. 모듈 설치나 업데이트 시 Odoo가 자동으로 데이터베이스 칼럼을 생성해 주므로 유지보수와 재현성 측면에서 안정적입니다.


XML-RPC API로 생성하기

원격 구성 스크립트 같은 프로그래매틱한 배포 방식에서는 XML-RPC API로 ir.model.fields 레코드를 생성해 Related 필드를 만들 수 있습니다.

field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_partner_country_id',
        'field_description': 'Customer Country',
        'model_id': sale_order_model_id,
        'ttype': 'many2one',
        'relation': 'res.country',
        'related': 'partner_id.country_id',
        'store': True,
        'readonly': True,
        'state': 'manual',
    }]
)

API로 필드를 만들 때는 ttype과 relation을 수동으로 정확히 지정해야 합니다. 파이썬 ORM처럼 체인에서 타입을 자동 추론하지 않으므로 주의가 필요합니다. 자동화된 배포 스크립트로 필드를 적용하는 팀에서 주로 사용하는 방식입니다.

권장 관행


설계 및 운영 권장 사항 요약

1) 필터링·그룹화가 필요하면 필드를 저장하세요. 리스트 뷰에서 필터를 적용하거나 피벗에서 그룹화하려면 store=True가 필수입니다. 표시용이라면 비저장으로도 무방합니다.


2) 체인을 가능한 짧게 유지하세요.

partner_id.country_id 같은 2단 체인은 성능과 유지보수 측면에서 깔끔합니다. picking_id.sale_id.partner_id.country_id 같은 4단 체인은 실패 지점이 늘어나므로 복잡해지면 계산 필드로 전환을 고려하세요.


3) readonly=False의 의미를 정확히 이해하세요.

쓰기 가능한 Related 필드는 로컬에 값을 복제하지 않고 소스 레코드를 변경합니다. 예컨대 주문 폼에서 partner_id.phone을 편집하면 res.partner의 전화번호가 바뀌어 연관된 모든 문서에 영향이 갑니다. 이런 동작이 의도된 것인지 항상 확인하고 사용자에게 고지하세요.


4) 데이터 중복용으로 사용하지 마세요.

Related 필드는 기존 값을 문맥에 노출하기 위한 기능입니다. 원본과 독립적으로 관리되는 복제본이 필요하면, onchange나 자동 액션으로 기본값을 설정한 일반 필드를 사용하는 편이 맞습니다.


5) 접근 권한(Access Rights)을 점검하세요.

Related 필드는 다른 모델을 거쳐 값을 읽습니다. 사용자가 중간 모델을 읽을 권한이 없다면 값이 비어 보일 수 있으니, 폼 설계 시 관련 모든 모델에 대해 예상 사용자 역할의 권한을 확인하세요.

자주 발생하는 문제점


자주 발생하는 실수: 비저장 Related 필드에 대한 필터링 시도

가장 흔한 오류입니다. 리스트에 Related 필드를 추가하고 검색 필터로 사용하려다 실패하는 경우가 많습니다. 기본값 store=False이면 DB 레벨에서 필터링할 수 없습니다. 검색이나 그룹화에 쓸 필드라면 반드시 store=True로 설정하세요.


예상치 못한 쓰기 전달 동작

Studio에서 Related 필드를 추가하고 readonly=False로 둔 뒤, 사용자가 값을 바꾸면 원본 레코드가 수정되는 사실에 놀라는 사례가 많습니다. Related 필드를 편집 가능하게 만들기 전에는 비즈니스 담당자와 반드시 상의하세요.


체인 중간 필드가 비어 있을 때 처리 미흡

체인 중간에 어떤 필드가 비어 있으면 Related 필드는 False를 반환합니다. 폼에서는 빈칸으로 보이고, 파이썬에서 값을 읽어 처리할 때는 False 케이스를 잘 핸들링하지 않으면 TypeError가 발생할 수 있습니다. 테스트 시 모든 레코드가 완전한 상태일 때만 검증하면 배포 후 문제가 드러날 수 있으니 주의하세요.


Related가 아니라 계산(Computed) 필드가 더 적합한 경우

단순히 다른 레코드의 값을 노출하는 목적이면 Related가 좋습니다. 그러나 값에 변환, 조건부 로직, 복잡한 처리 등이 필요하면 파이썬으로 계산 필드를 만들어 명시적으로 로직을 구현하는 것이 유지보수와 업그레이드 안전성 측면에서 옳습니다.


대규모 모델에서 많은 저장된 Related 필드가 성능 문제를 일으킬 수 있음

저장된 Related 필드는 소스 변경 시마다 업데이트됩니다. 수십만 건의 레코드를 가진 모델에 저장된 Related 필드를 여러 개 두고 소스 값이 자주 바뀐다면 DB 쓰기 부하가 커집니다. 대규모 배포에서는 저장 여부의 성능 영향을 프로파일링하고 실시간 정확도가 불필요한 경우 비저장 필드를 선호하세요.

마무리


Related 필드는 데이터를 중복하지 않고 문맥 정보를 노출하는 데 매우 실용적인 도구입니다. 관계 체인을 따라가 다른 모델의 값을 뷰에 직접 보여주고, 필요하면 저장해 보고와 필터링에 활용할 수 있습니다.


store=True를 언제 써야 하는지, readonly=False가 어떤 의미인지, 체인 중간이 비었을 때를 어떻게 처리할지 명확히 이해하면 Odoo 구현에서 흔한 데이터 문제를 예방할 수 있습니다. 파이썬 모듈을 작성하는 개발자든 Studio로 작업하는 컨설턴트든, 또는 원격 구성 관리 책임자든 Related 필드는 반드시 숙지할 가치가 있습니다.

Odoo 데이터 모델을 설계하거나 확장할 때 Related 필드는 Computed 필드, Many2one 등 다른 필드 유형과 함께 필수 도구로 자리합니다.

Dasolo에서는 영업, 운영, 회계 등 전 분야에 걸쳐 Odoo 구현·커스터마이즈·최적화를 지원합니다. 데이터 모델 설계, 워크플로우에 맞춘 커스텀 필드 추가, 안정적이고 유지보수 가능한 코드로 Odoo를 확장하는 작업을 도와드립니다. 문의하기 프로젝트 상황을 알려주시면 어떻게 도와드릴지 논의해 보겠습니다.

Odoo Related Field 완전 정복: 개념부터 활용까지
Dasolo 2026년 3월 6일
이 게시물 공유하기
로그인 의견을 남기기