Wstęp
W Odoo każda informacja biznesowa — faktury, zamówienia, kontrahenci — trafia do systemu jako rekord pewnego modelu. Modele określają strukturę danych i sposób ich przechowywania w bazie, dlatego rozumienie ich roli jest kluczowe dla efektywnej pracy z systemem.
Znajomość architektury modeli przydaje się zarówno programistom, jak i konsultantom funkcjonalnym. To modele definiują pola, relacje i logikę biznesową; wiedza o nich to fundament przy modyfikacjach, rozszerzeniach i analizie systemu.
Gdzie Odoo przechowuje informacje o wszystkich tych modelach? Za to odpowiada ir.model — centralny rejestr metadanych. Gdy tworzysz własny moduł, projektujesz model w Studio lub sprawdzasz API, prędzej czy później trafisz na ir.model.
Czym jest model ir.model
ir.model to tabelka z jedną pozycją na każdy model obecny w systemie. Kiedy zdefiniujesz nowy model w Pythonie lub przez Studio, system dodaje lub aktualizuje rekord w tym rejestrze — to jego sposób na śledzenie struktury aplikacji.
Ten rejestr jest częścią rdzenia Odoo i używany przez moduł base. Niezależnie od tego, czy mamy do czynienia z modelem standardowym, abstrakcyjnym czy tymczasowym (transient), powinien istnieć odpowiadający mu wpis w ir.model, o ile model ma fizyczne odwzorowanie w DB.
ir.model współpracuje ściśle z ir.model.fields — tabelą opisującą każde pole w modelu. Razem zapewniają mechanizmy introspekcji: dzięki nim system i zewnętrzne narzędzia mogą „przeczytać” strukturę modeli i ich pól.
Deweloperzy odwołują się do ir.model, kiedy potrzebują wypisać dostępne modele, prześledzić dziedziczenie lub zbudować narzędzia działające uniwersalnie dla różnych modeli. Rejestr jest także dostępny przez API (XML-RPC/JSON-RPC) do automatycznej analizy.
Kluczowe pola w modelu
Poniżej zebrano najważniejsze pola, które znajdziesz w ir.model. Znajomość ich znaczenia ułatwi pracę z rejestrem i zrozumienie, co dany model reprezentuje.
1. name
Typ: Char. Czytelna, często tłumaczalna nazwa modelu używana w interfejsie technicznym i narzędziach deweloperskich. To etykieta, którą zobaczysz podczas przeglądania listy modeli.
2. model
Typ: Char. Techniczna nazwa modelu używana w kodzie, np. res.partner czy sale.order. Pole jest wymagane i indeksowane, aby szybko wyszukiwać metadane po nazwie.
3. info
Typ: Text. Dodatkowy opis lub notatki dotyczące modelu — przydatne w dokumentacji wewnętrznej, często puste dla prostszych modeli.
4. state
Typ: Selection. Określa pochodzenie modelu: 'base' dla modeli z modułów Odoo lub 'manual' dla tych utworzonych przez użytkownika (Studio) czy niestandardowego kodu. Modele systemowe mają zwykle ograniczenia edycyjne.
5. transient
Typ: Boolean. Flaga określająca, czy model jest tymczasowy (transient). Modele transient służą do przechowywania danych tymczasowych i są okresowo czyszczone — typowe dla kreatorów i okien dialogowych.
6. field_id
Typ: One2many (ir.model.fields). Lista wszystkich pól przypisanych do modelu. Każdy rekord ir.model.fields zawiera szczegóły jednego pola: jego nazwę, typ i atrybuty.
7. access_ids
Typ: One2many (ir.model.access). Zestaw reguł uprawnień dotyczących modelu — które grupy mogą tworzyć, czytać, modyfikować lub usuwać rekordy.
8. rule_ids
Typ: One2many (ir.rule). Zasady ograniczające dostęp do konkretnych rekordów (row-level security). Wykorzystywane do definiowania widoczności danych na poziomie wiersza.
9. inherited_model_ids
Typ: Many2many (ir.model). Powiązania z modelami nadrzędnymi w przypadku dziedziczenia. Gdy rozszerzasz istniejący model, tutaj znajdzie się lista rodziców.
10. modules
Typ: Char. Pole obliczane pokazujące moduły, które definiują lub rozszerzają dany model — pomocne przy analizie zależności i źródeł definicji.
11. sort
Typ: Integer. Określa kolejność wyświetlania modelu w menu Technicznym; mniejsze wartości pojawiają się wcześniej, co ułatwia porządkowanie listy.
12. constrains
Typ: Text. Kod definiujący ograniczenia Pythona (@api.constrains) używany do niestandardowej walidacji danych na poziomie modelu.
13. post_constrains
Typ: Text. Definicje walidacji wykonywane po podstawowych ograniczeniach — stosowane w bardziej złożonych scenariuszach sprawdzania poprawności.
14. sql_constraints
Typ: Text. Ograniczenia na poziomie bazy danych (np. unikalne indeksy) zapewniające integralność danych poza logiką aplikacji.
15. view_ids
Typ: One2many (ir.ui.view). Pole obliczane z listą widoków powiązanych z modelem — przydatne przy zarządzaniu interfejsem i introspekcji widoków.
16. record_count
Typ: Integer. Pole obliczane pokazujące liczbę rekordów tego modelu w bazie — szybka informacja o skali danych przechowywanych przez model.
17. display_name
Typ: Char. Pole obliczane używane do prezentacji rekordu w relacjach i listach; zwykle łączy nazwę i inne identyfikatory dla czytelniejszego wyświetlania.
18. create_date
Typ: Datetime. Data i godzina utworzenia rekordu w rejestrze — zarządzane automatycznie przez system.
19. create_uid
Typ: Many2one (res.users). Użytkownik, który utworzył dany wpis — używane do audytu i śledzenia zmian.
20. write_date
Typ: Datetime. Data i czas ostatniej modyfikacji rekordu — także aktualizowana automatycznie.
21. write_uid
Typ: Many2one (res.users). Użytkownik, który ostatnio edytował rekord — istotne przy analizie zmian.
22. active
Typ: Boolean. Flaga archiwizacji; gdy False, rekord jest wyłączony (soft delete) i zwykle nie widoczny w standardowych widokach.
23. id
Typ: Integer. Unikalny identyfikator w bazie danych — używany przy odwołaniach przez API i wewnętrznych relacjach.
24. restrict_functionality
Typ: Boolean. Flaga wskazująca ograniczenia funkcjonalne zależne od edycji Odoo (np. Enterprise vs Community).
25. is_mail_thread
Typ: Boolean. Określa, czy model obsługuje chatter (wiadomości i śledzenie) — modele z tą flagą mają powiązania z systemem komunikacji.
26. is_mail_activity
Typ: Boolean. Flaga mówiąca, czy model obsługuje aktywności (planer zadań) — przydatne przy śledzeniu kolejnych kroków pracy.
Jak model wpływa na procesy biznesowe
1. Ustawienia techniczne i konfiguracja
Administratorzy korzystają z menu Ustawienia techniczne, aby przeglądać zarejestrowane modele. To tam ir.model decyduje, co zostanie pokazane — nazwa, opis i liczba pól pomagają zorientować się w zawartości systemu.
2. Zarządzanie uprawnieniami
Przy konfiguracji bezpieczeństwa przypisujesz prawa do grup. access_ids w ir.model definiuje, które grupy mogą tworzyć, odczytywać, modyfikować lub usuwać rekordy danego modelu.
3. Dostosowania w Odoo Studio
Tworząc modele w Odoo Studio otrzymujesz nowe wpisy ir.model ze statusem manual; pole field_id zostanie wypełnione utworzonymi polami. To umożliwia szybkie prototypowanie bez kodu.
4. Odkrywanie przez API i integracje
Systemy zewnętrzne łączące się z Odoo mogą odpytywać ir.model przez XML-RPC/JSON-RPC, aby poznać dostępne modele i ich strukturę — to podstawowa metoda automatycznej integracji i generowania klienta API.
5. Tworzenie modułów i debugowanie
Deweloperzy patrzą na ir.model, by zrozumieć łańcuch dziedziczenia (inherited_model_ids) i listę pól (field_id). To jeden z narzędzi pomocnych przy tworzeniu i naprawianiu rozszerzeń.
Jak deweloperzy rozszerzają rejestr modeli
Rzadko modyfikuje się ir.model bezpośrednio — zazwyczaj wystarczy zdefiniować nowe modele czy pola, a rejestr zostanie zaktualizowany automatycznie podczas ładowania modułu.
Dziedziczenie modeli
Gdy w Pythonie użyjesz _inherit = 'res.partner', Odoo zaktualizuje wpisy rejestru tak, by odzwierciedlić relacje z modelem rodzica. Pole inherited_model_ids pokazuje powiązania między modelem bazowym a rozszerzeniami.
Dodawanie pól
Dodając pola do modelu system tworzy odpowiadające rekordy w ir.model.fields i łączy je z ir.model przez model_id; sam wpis w ir.model zwykle pozostaje bezpośrednio niezmieniony.
Rozszerzenia w Pythonie
Zamiast nadpisywać metody ir.model, standardowym podejściem jest rozszerzanie poszczególnych modeli opisanych w rejestrze. ir.model pełni rolę źródła metadanych, a logikę biznesową zmieniasz w klasach modeli.
Odoo Studio
Studio automatycznie tworzy wpisy w ir.model i ir.model.fields podczas projektowania modeli bez kodu. Flaga transient pozwala odróżnić modele tymczasowe. Modele abstrakcyjne nie generują wpisów w rejestrze, bo nie mają tabeli w DB.
Dobre praktyki
- Do introspekcji i dynamicznej walidacji integracji zapytuj ir.model zamiast na stałe wpisywać nazwy modeli w kodzie — to ułatwia utrzymanie i kompatybilność.
- Używaj pola model do wyszukiwań — jest indeksowane i pozwala szybko pobrać metadane konkretnego modelu.
- Sprawdzaj inherited_model_ids przed rozszerzaniem modeli — zrozumienie łańcucha dziedziczenia zapobiegnie konfliktom i nieoczekiwanym skutkom modyfikacji.
- Korzystaj z API (XML-RPC/JSON-RPC) do bezpiecznego odczytu ir.model. Unikaj bezpośrednich zmian, chyba że tworzysz narzędzie podobne do Studio.
- Do analizy pól wykorzystuj ir.model.fields — relacja field_id dostarczy pełnej listy pól i ich atrybutów dla danego modelu.
Typowe błędy
- Modyfikowanie ir.model ręcznie bywa niebezpieczne: rejestr jest zarządzany przez system i zmiany mogą zostać nadpisane podczas aktualizacji lub wywołać błędy.
- Nie myl ir.model z klasą Pythona modelu — ir.model to rekord metadanych w bazie; klasa to implementacja biznesowej logiki. Obie warstwy są powiązane, lecz różne.
- Pamiętaj, że modele abstrakcyjne nie zawsze mają wpis w ir.model — nie tworzą tabeli w DB, dlatego nie pojawią się w rejestrze.
- Nie zapominaj o modelach tymczasowych — transient oznacza porządkowanie i czyszczenie danych. Nie używaj ich do przechowywania trwałych informacji.
- Nie odpytywaj ir.model bez filtrów — w typowej instancji Odoo jest setki modeli. Używaj warunków wyszukiwania, by ograniczyć zbiór wyników.
Podsumowanie
ir.model to centralny rejestr wszystkich modeli Odoo, przechowujący metadane i powiązania z ir.model.fields. Zrozumienie tego mechanizmu ułatwia orientację w strukturze danych systemu.
Niezależnie od roli — konsultanta przeglądającego ustawienia techniczne czy integratora piszącego klienta API — znajomość ir.model przyspieszy pracę i zmniejszy ryzyko błędów.
Potrzebujesz pomocy z wdrożeniem Odoo?
Dasolo wspiera firmy we wdrożeniach, modyfikacjach i optymalizacji Odoo. Specjalizujemy się w integracjach API i rozwoju modułów, a nasz zespół ma praktyczne doświadczenie z architekturą danych Odoo i modelami takimi jak ir.model.
Potrzebujesz wsparcia przy wdrożeniu Odoo, tworzeniu modułów lub integracji? Chętnie pomożemy. Umów demo aby porozmawiać o Twoim projekcie.