Przejdź do zawartości

Related Field w Odoo — Kompletny Przewodnik

Praktyczny przewodnik po polu Related w Odoo: zasady działania, typowe zastosowania oraz konfiguracja w Studio i w Pythonie
6 marca 2026 przez
Related Field w Odoo — Kompletny Przewodnik
Dasolo
| Brak komentarzy na ten moment

Wprowadzenie


Pracując z modelem danych Odoo często pojawia się potrzeba pokazania informacji z powiązanego rekordu bez otwierania go w osobnym widoku. Pole powiązane (related) pozwala wyciągnąć takie dane na formularzu w sposób deklaratywny — bez dodatkowego kodu, gdyż udostępnia wartość z innego modelu bez jej duplikowania.


Zamiast pisać pole obliczane z metodą Pythona, pole powiązane „przechodzi” po łańcuchu relacji i pobiera końcową wartość. To prosty, często używany mechanizm — przydatny zarówno deweloperom, jak i konsultantom korzystającym z Odoo Studio, którzy chcą wzbogacić widoki bez programowania.


W tym tekście wyjaśnię, co pole powiązane właściwie reprezentuje, jak Odoo je obsługuje, jak dodać je przez Studio lub w kodzie, oraz w jakich scenariuszach biznesowych warto z niego korzystać.

Czym jest pole powiązane w Odoo


W ramach ORM Odoo pole powiązane nie jest osobnym typem danych jak Float czy Char. To raczej skrót, który eksponuje pole z innego modelu poprzez ścieżkę relacji. Typ pola powiązanego odpowiada typowi docelowego pola, do którego prowadzi łańcuch.


Najprostszy scenariusz: na zamówieniu sprzedaży mamy pole partner_id wskazujące kontrahenta. Pole powiązane o ścieżce partner_id.country_id pokaże kraj klienta bez potrzeby przechowywania osobnej kolumny na zamówieniu.

Dla użytkownika pole powiązane wygląda jak zwykłe pole w formularzu: jeśli docelowe pole jest tekstem — widzi pole tekstowe, jeśli to relacja Many2one — pojawi się rozwijana lista, jeśli Boolean — checkbox. Wyświetlanie dziedziczy formę pola, na które wskazujemy.


Domyślnie pola powiązane są tylko do odczytu i nie są zapisywane w bazie danych. Dzięki temu zawsze pokazują aktualną wartość źródłową, ale nie można ich użyć w filtrach czy grupowaniach bez ustawienia store=True.


W Odoo Studio dodanie pola powiązanego jest bardzo proste — przy tworzeniu nowego pola wybieramy opcję Related i wskazujemy ścieżkę relacji. To szybkie rozwiązanie dla konsultantów, którzy chcą dodać kontekstowe informacje bez ingerencji w kod.

Jak pole powiązane działa


Odoo odczytuje pole powiązane jako sekwencję nazw oddzielonych kropkami. Każdy element oprócz ostatniego musi być polem relacyjnym (Many2one, One2many lub Many2many), a pole końcowe może być dowolnego typu.


Poniżej przykład implementacji pola powiązanego w module Pythona jako wzorzec do skopiowania w własnych modułach.


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,
    )

W tym przykładzie Odoo idzie od partner_id do rekordu res.partner i odczytuje country_id. W rezultacie powstaje pole Many2one na zamówieniu, które odzwierciedla kraj kontrahenta.


Pola przechowywane kontra nieprzechowywane

To kluczowa różnica: domyślnie store=False, więc wartość jest obliczana „na żywo” przy odczycie rekordu i nie istnieje jako kolumna w tabeli modelu.


Jeżeli ustawisz store=True, Odoo zapisuje wartość w bazie, co pozwala filtrować, grupować i wyszukiwać po tym polu — niezbędne przy raportach i widokach listy.


Kosztem przechowywania jest zajęcie przestrzeni w bazie i dodatkowe operacje zapisu przy zmianie źródłowej wartości. Odoo automatycznie aktualizuje zależności, ale przy dużych modelach z częstymi zmianami może to mieć wpływ na wydajność.


Pola tylko do odczytu kontra edytowalne

Domyślnie pola powiązane są readonly. Jeżeli ustawisz readonly=False, pole stanie się edytowalne i zmiany zostaną zapisane z powrotem do rekordu źródłowego. To potężna, lecz czasami myląca cecha — edytując pole na zamówieniu, tak naprawdę modyfikujesz rekord partnera.


Używaj zapisu „przez” pole powiązane tylko wtedy, gdy rzeczywiście chcesz, żeby edycja wpływała na źródło. Może to być przydatne, np. do szybkiej korekty z listy, ale grozi niezamierzonymi zmianami danych współdzielonych przez wiele dokumentów.


Główne atrybuty pola

Poniżej najważniejsze parametry, którymi sterujesz polem powiązanym:

  • related: Ścieżka nazw oddzielonych kropkami (np. 'partner_id.country_id'). To jedyne wymagane pole.
  • store: Ustaw na True, żeby zachować wartość w bazie — umożliwia filtrowanie i grupowanie.
  • readonly: Ustaw na False, aby pole było edytowalne i zapisywało zmiany do rekordu źródłowego.
  • string: Etykieta pokazywana użytkownikowi. Domyślnie bierze nazwę pola docelowego.
  • depends: Zazwyczaj nie jest potrzebne, bo Odoo sam rozpoznaje zależności z łańcucha related. Przydatne tylko w nietypowych przypadkach.

Jak pole współpracuje z ORM Odoo

Odczyt pola powiązanego zwraca wartość pola końcowego. Jeśli którykolwiek element pośredni jest pusty (np. partner_id nie ustawiony), pole powiązane zwróci False — standardowe zachowanie ORM Odoo.


Pola powiązane wspierane są w domenach, widokach i raportach wtedy, gdy są przechowywane. Nieprzechowywane można wyświetlać, ale nie używać ich jako kryterium filtrowania w zapytaniach SQL bez oceny po stronie Pythona.

Przykłady zastosowań w firmie


Pola powiązane znajdują zastosowanie w wielu obszarach Odoo. Poniżej pięć praktycznych przykładów pokazujących typowe potrzeby biznesowe.


CRM i sprzedaż: numer telefonu klienta na zamówieniu

Zespoły sprzedaży często chcą widzieć numer telefonu klienta bez otwierania karty kontrahenta. Pole related='partner_id.phone' na sale.order pokazuje numer w kontekście zamówienia, przyspieszając rozmowy handlowe i eliminując konieczność dodatkowego kliknięcia. W Studio dodanie takiego pola zajmuje dosłownie chwilę.


Księgowość: waluta firmy na pozycjach faktury

W środowiskach multi-company księgowi mogą potrzebować waluty firmy widocznej na liniach faktury. Pole related='move_id.company_id.currency_id' przechodzi przez dwie relacje, aż do waluty. Taka ścieżka jest dopuszczalna, choć zaleca się ograniczać długość łańcucha dla lepszej wydajności. Zapisanie pola ułatwia filtrowanie faktur po walucie w raportach analitycznych.


Magazyn: kategoria produktu na ruchach towarowych

Zespoły magazynowe często muszą widzieć kategorię produktu bez otwierania karty produktu. Pole related='product_id.categ_id' na stock.move.line eksponuje kategorię bezpośrednio na linii. Jeśli ustawisz store=True, można grupować i raportować ruchy według kategorii, co bywa nieocenione dla firm z szerokim asortymentem.


Produkcja: numer katalogowy na komponentach zleceń

Kierownik produkcji chce, żeby operatorzy widzieli numer wewnętrzny produktu podczas realizacji zleceń. Pole related='product_id.default_code' na liniach mrp.workorder umieszcza ten numer tam, gdzie jest potrzebny, zmniejszając ryzyko pomyłek przy wyborze podobnych części.


Czas pracy i projekty: dział pracownika na timesheetach

Menadżerowie projektów często muszą klasyfikować koszty według działów. Pole related='employee_id.department_id' na account.analytic.line (timesheet) pokazuje dział pracownika bezpośrednio na wpisie. Przechowywane pole (store=True) pozwala później filtrować i analizować czasy pracy po dziale w raportach projektowych.

Tworzenie i modyfikacja pola powiązanego


Sposoby dodawania pola powiązanego


Są trzy typowe metody: przez Odoo Studio, przez kod w module Pythona oraz przez zdalne API — wybór zależy od sposobu zarządzania wdrożeniem.

Odoo Studio (bez kodu)

  1. Studio umożliwia dodanie pola powiązanego bez programowania. Kroki są proste i intuicyjne:
  2. Wejdź do Odoo Studio z głównego menu.
  3. Otwórz formularz, do którego chcesz dodać pole.
  4. Kliknij Dodaj pole i wybierz Related Field.
  5. Wskaż ścieżkę relacji, przechodząc krok po kroku przez dostępne pola.
  6. Nadaj etykietę i ustaw, czy pole ma być przechowywane oraz czy ma być edytowalne.

Zapisz i zamknij Studio.


Studio automatycznie stworzy pole z prefiksem x_studio_ i umieści je we właściwym miejscu widoku — to szybki sposób na wzbogacenie formularzy bez zmian w strukturze bazy po stronie deweloperów.

Przez Pythona w module niestandardowym


Deweloperzy powinni definiować pola powiązane w klasie modelu — to zalecana metoda przy pracy z kontrolą wersji i wdrożeniach wielośrodowiskowych:

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, )


Po zdefiniowaniu pola dodaj je do XML widoku, by było widoczne w interfejsie. Podczas instalacji lub aktualizacji modułu Odoo zadba o utworzenie kolumny w bazie. To standardowy, stabilny sposób rozbudowy modelu.

Przez XML-RPC API

W zautomatyzowanych wdrożeniach pola powiązane można tworzyć także przez XML-RPC, ustawiając atrybut related w definicji pola:

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', }] )

Dobre praktyki


Tworząc pole przez API, musisz ręcznie podać ttype i relation, ponieważ API nie wnioskuje ich automatycznie z łańcucha tak jak ORM Pythona. Taki sposób przydaje się w skryptach automatyzujących konfigurację środowisk.

1. Zapisuj pole, gdy potrzebujesz filtrowania lub grupowania


Jeżeli planujesz używać pola w filtrach listy lub grupowaniu w pivotach, ustaw store=True. Bez tego Odoo nie wykona filtrowania po stronie bazy, co nie skaluje się dla dużych zbiorów danych. Dla pól wyłącznie do wyświetlania w formularzach wystarczy wersja nieprzechowywana.

2. Skracaj łańcuch relacji


Dwuetapowy łańcuch jak partner_id.country_id jest jasny i szybki. Bardziej rozbudowane ścieżki zwiększają ryzyko błędów i utrudniają utrzymanie. Przy bardzo głębokich zależnościach rozważ użycie pola obliczanego z logiką Pythona.

3. Wiedz, co oznacza readonly=False


Edycyjne pole powiązane nie tworzy lokalnej kopii danych — zmienia rekord źródłowy. Jeśli dopuścisz edycję partner_id.phone na zamówieniu, każda zmiana zaktualizuje res.partner. Upewnij się, że biznes rozumie konsekwencje i że to zamierzony efekt.

4. Używaj przede wszystkim do prezentacji, nie jako duplikatu danych


Pola powiązane powinny wyłącznie eksponować istniejące informacje. Jeżeli potrzebujesz niezależnej kopii wartości, która może się różnić od źródła, lepsze będzie zwykłe pole z domyślną wartością ustawioną przez onchange lub automatyzację—nie pole powiązane z store=True i readonly=False.

5. Sprawdź prawa dostępu

Typowe pułapki


Pole powiązane odczytuje dane z innego modelu. Jeżeli użytkownik nie ma praw do odczytu tego modelu, pole może być puste bez komunikatu wyjaśniającego. To zgodne z mechanizmem zabezpieczeń Odoo, ale warto to uwzględnić przy projektowaniu formularzy i uprawnień.

Filtrowanie po nieprzechowywanym polu powiązanym


Najczęstszy błąd to dodanie pola do widoku listy i próba użycia go w filtrze bez store=True. W takiej sytuacji wyszukiwanie nie zadziała na poziomie bazy i domain może zwrócić błąd lub puste wyniki. Dodaj store=True do pól, które mają służyć jako kryterium wyszukiwania lub grupowania.

Nieoczekiwane przepisywanie danych źródłowych


Ustawienie readonly=False i późniejsze zdziwienie, że edycja zmienia rekord źródłowy, to częsta przyczyna problemów — zwłaszcza gdy pola powiązane dodają osoby nieznające mechaniki Odoo Studio. Zanim pole stanie się edytowalne, uzgodnij z biznesem, czy edycja ma propagować się do źródła.

Nieobsłużone puste pola pośrednie


Jeżeli któryś element łańcucha jest pusty, related zwróci False. W formularzu widzimy wtedy pustą wartość, a w metodach Pythona trzeba obsłużyć tę sytuację, żeby uniknąć błędów typu. To często wypływa dopiero w produkcji, gdy dane są niekompletne.

Kiedy lepsze jest pole obliczane niż related


Pola powiązane sprawdzają się przy lustrzanym odczycie pojedynczej wartości. Gdy potrzebujesz logiki, transformacji lub warunków, lepszym wyborem jest pole obliczane z metodą Pythona. Próby „przeciągnięcia” logiki przez łańcuch related kończą się trudnymi do utrzymania obejściami.

Problemy wydajnościowe przy wielu zapisanych polach

Podsumowanie


Każde zapisywane pole powiązane musi się aktualizować przy zmianie źródła. Jeśli dodasz wiele store=True pól na dużym modelu, a pola źródłowe często się zmieniają, generujesz spory narzut zapisu. W dużych wdrożeniach profiluj wpływ i tam, gdzie wystarczy, korzystaj z pól wyświetlanych bez przechowywania.


Pole powiązane to praktyczne narzędzie Odoo do wyświetlania kontekstowych informacji bez dublowania danych. Umożliwia odczyt przez łańcuch relacji, prezentację wartości z powiązanych rekordów w dowolnym widoku oraz opcjonalne zapisanie tych wartości do celów raportowych.

Zrozumienie, kiedy ustawić store=True, kiedy dopuszczać readonly=False i jak obsługiwać puste pola pośrednie, pozwala uniknąć typowych problemów wdrożeniowych. Niezależnie od tego, czy jesteś deweloperem, konsultantem Studio czy administratorem konfiguracji, warto dobrze poznać pole powiązane i jego ograniczenia.

Jeżeli rozwijasz lub rozszerzasz model danych Odoo, pola powiązane powinny być podstawowym narzędziem obok pól obliczanych, Many2one i innych typów opisanych w tej serii. W Dasolo pomagamy firmom we wdrożeniach, dostosowaniach i optymalizacji Odoo w obszarach sprzedaży, operacji i księgowości. Jeśli potrzebujesz pomocy przy projektowaniu modelu danych, dodawaniu pól do procesów biznesowych lub rozbudowie Odoo w sposób utrzymywalny, możemy wesprzeć Twój projekt. Skontaktuj się z nami i porozmawiajmy, jak możemy wesprzeć Twoje wdrożenie Odoo.

Related Field w Odoo — Kompletny Przewodnik
Dasolo 6 marca 2026
Udostępnij ten artykuł
Zaloguj się by zostawić komentarz