Introductie
In Odoo bepaalt elk model de structuur en opslag van gegevens in de database. Alles wat met je bedrijfsvoering te maken heeft — klanten, verkooporders, facturen — leeft binnen een model.
Goed zicht op Odoo-modellen is onmisbaar voor zowel ontwikkelaars als functionele consultants. Modellen vormen het fundament van de data-architectuur: ze definiëren velden, relaties en de kernlogica achter je bedrijfsprocessen.
Waar bewaart Odoo dan de beschrijving van al die modellen? Dat doet het ir.model-model. Het fungeert als het register met metadata over alle modellen in het systeem. Of je nu een module bouwt, de API onderzoekt of een fout oplost, je komt ir.model vroeg of laat tegen.
Wat is het ir.model-model?
Het ir.model is in essentie het metadata-register voor alle Odoo-modellen: één record per model. Telkens je een nieuw model declareert in Python of met Studio aanmaakt, verschijnt er een ir.model-record of wordt een bestaand record bijgewerkt.
Dit model maakt deel uit van de basismodule en zit in het hart van het Odoo-framework. Of het nu gaat om een gewoon model, een abstract model of een transient model — elk heeft een corresponderende ir.model-vermelding.
ir.model werkt nauw samen met ir.model.fields, dat de metadata van individuele velden bewaart. Samen vormen ze de technische ruggengraat waarmee Odoo informatie kan inspecteren en dynamisch mee kan omgaan.
Ontwikkelaars raadplegen ir.model wanneer ze beschikbare modellen willen opsommen, nalopen hoe er geërfd wordt of tools bouwen die met willekeurige modellen moeten werken. ir.model is ook via de API (XML-RPC/JSON-RPC) toegankelijk voor integraties.
Belangrijke velden in dit model
Hieronder vind je de velden die je het meest tegenkomt in ir.model. Kennis van deze velden maakt het eenvoudiger om met het modelregister te werken.
1. name
Type: Char. De leesbare titel van het model die zichtbaar is in Technische instellingen en ontwikkelaarstools. Dit is het label dat gebruikers herkennen bij het bladeren door modellen.
2. model
Type: Char. De technische naam van het model — de string die je gebruikt in code, bijvoorbeeld res.partner of sale.order. Dit veld is verplicht en geïndexeerd voor snelle zoekacties.
3. info
Type: Text. Extra toelichting of notities over het model. Vaak voor documentatie of intern gebruik; kan bij veel modellen leeg zijn.
4. state
Type: Selection. Geeft aan of het model uit de basiscode (base) komt of handmatig is aangemaakt (manual). Basismodellen zijn beschermd, handmatige modellen zijn makkelijker aan te passen.
5. transient
Type: Boolean. Geeft aan of het gaat om een transient model. Die zijn tijdelijk en worden periodiek opgeschoond — ideaal voor wizard-data en tijdelijke opslag.
6. field_id
Type: One2many (ir.model.fields). De lijst met velden die op dit model gedefinieerd zijn. Elk record beschrijft één veld met naam, type en eigenschappen.
7. access_ids
Type: One2many (ir.model.access). De toegangsrechten voor het model: welke groepen mogen aanmaken, lezen, wijzigen of verwijderen. Cruciaal voor beveiliging.
8. rule_ids
Type: One2many (ir.rule). De recordregels die bepalen welke records gebruikers mogen zien — row-level security voor je data.
9. inherited_model_ids
Type: Many2many (ir.model). Verwijst naar oudermodellen bij model-erfenis. Wanneer je een model uitbreidt, worden hier de linken naar de parentmodellen bewaard.
10. modules
Type: Char. Een berekend veld dat toont in welke modules het model voorkomt. Handig om te zien welke modules het model definiëren of uitbreiden.
11. sort
Type: Integer. Sorteervolgorde in het menu Technische instellingen; lagere waarden verschijnen eerst. Handig om je modeloverzicht te ordenen.
12. constrains
Type: Text. Python-constraintdefinities (bijv. @api.constrains). Hier staat aangepaste validatielogica opgeslagen.
13. post_constrains
Type: Text. Post-validatie Python-code, gebruikt voor complexere validaties die na de standaardchecks lopen.
14. sql_constraints
Type: Text. SQL-constraintdefinities zoals unieke indexen. Deze zorgen voor dataintegriteit op database-niveau.
15. view_ids
Type: One2many (ir.ui.view). Een berekend veld met de views die bij dit model horen — nuttig bij viewbeheer en inspectie.
16. record_count
Type: Integer. Aantal records in het model. Handig om snel in te schatten hoeveel data een model bevat.
17. display_name
Type: Char. Een berekende weergavenaam die gebruikt wordt in lijsten en relationele velden, vaak een combinatie van name en model.
18. create_date
Type: Datetime. Datum en tijd van aanmaak; wordt automatisch door Odoo beheerd.
19. create_uid
Type: Many2one (res.users). De gebruiker die het record heeft aangemaakt; belangrijk voor audit-trails.
20. write_date
Type: Datetime. Datum en tijd van de laatste wijziging; ook automatisch bijgehouden.
21. write_uid
Type: Many2one (res.users). De gebruiker die als laatste wijziging doorvoerde; nuttig voor opsporing en verantwoordelijkheid.
22. active
Type: Boolean. Soft-delete vlag: wanneer False is het record gearchiveerd. Handig om verouderde modellen uit de dagelijkse lijst te halen.
23. id
Type: Integer. De unieke database-ID van het ir.model-record; gebruikt bij API-aanroepen en referenties.
24. restrict_functionality
Type: Boolean. Geeft aan of bepaalde functionaliteit beperkt is in specifieke Odoo-edities; relevant bij enterprise/ community-differentiatie.
25. is_mail_thread
Type: Boolean. Of het model ondersteuning heeft voor chatter (berichten, volgers). Duidt aan of het model communicatie en discussies ondersteunt.
26. is_mail_activity
Type: Boolean. Of het model activiteiten ondersteunt (actiplanner, volgende acties). Belangrijk voor taak- en opvolgfunctionaliteit.
Hoe bedrijven dit model in workflows gebruiken
1. Technische instellingen en configuratie
Beheerders gebruiken het menu Technische instellingen om door modellen te bladeren. De ir.model-records bepalen wat in die lijst verschijnt en tonen naam, omschrijving en aantal velden.
2. Beheer van toegangsrechten
Bij het instellen van beveiliging wijzen beheerders rechten toe aan groepen. De access_ids op ir.model bepalen welke groepen CRUD-rechten hebben op elk model.
3. Aanpassingen met Odoo Studio
Wanneer gebruikers in Odoo Studio eigen modellen maken, genereert Odoo ir.model-records met de status manual. De bijbehorende field_id-relatie toont de toegevoegde velden.
4. API en integratiedetectie
Externe systemen ontdekken Odoo-modellen via XML-RPC of JSON-RPC. Ze kunnen ir.model bevragen om beschikbare modellen en hun structuur te achterhalen — essentieel voor automatische integraties.
5. Moduleontwikkeling en debugging
Ontwikkelaars raadplegen ir.model bij het bouwen van modules: ze controleren inherited_model_ids voor erfenis en field_id om te zien welke velden een model heeft.
Hoe ontwikkelaars dit model uitbreiden
Ontwikkelaars zullen ir.model zelden zelf aanpassen. Het register wordt automatisch bijgewerkt bij het laden van modules; veranderingen aan het register gebeuren meestal indirect via modeldefinities.
Modelerfenis
Wanneer je in Python _inherit = 'res.partner' gebruikt, werkt Odoo het ir.model-record van res.partner bij. Inherited_model_ids op het nieuwe model verwijzen naar de ouders — zo houdt het register de erfenisketen bij.
Velden toevoegen
Bij het toevoegen van velden maakt Odoo ir.model.fields-records die via model_id aan het ir.model-record gekoppeld worden. Het ir.model-record zelf verandert doorgaans niet.
Python-uitbreidingen
Meestal override je geen ir.model-methodes. Het model hoort bij de kern van Odoo. Als je gedrag wil aanpassen, breid je de modellen uit die ir.model beschrijft, niet ir.model zelf.
Odoo Studio
Odoo Studio genereert ir.model en ir.model.fields voor aangepaste modellen zonder code. Transient-modellen krijgen de transient-vlag, terwijl abstracte modellen doorgaans geen ir.model-vermelding krijgen omdat ze geen database-tabel hebben.
Aanbevolen werkwijzen
- Gebruik ir.model voor introspectie en ontdekking: bij integraties is het slimmer om ir.model te bevragen dan om modelnamen hardcoded in je code te zetten.
- Gebruik het model-veld voor snelle lookups: het is geïndexeerd en ideaal wanneer je metadata van een specifiek model nodig hebt.
- Controleer inherited_model_ids voordat je uitbreidt: zo begrijp je de erfenisketen en voorkom je onverwachte bijwerkingen.
- Lees ir.model via de API (XML-RPC/JSON-RPC) voor integraties. Pas het alleen aan als je een Studio-achtige tool bouwt — wijziging kan riskant zijn.
- Gebruik ir.model.fields voor veldniveau-introspectie: de field_id-relatie geeft een compleet beeld van alle velden op een model.
Veelvoorkomende fouten
- Direct ir.model-records wijzigen is riskant. Het register wordt centraal beheerd door Odoo; handmatige aanpassingen kunnen het systeem breken of bij upgrades overschreven worden.
- ir.model verwarren met de Python-klasse is een veelgemaakte misvatting. ir.model is het database-record met metadata; de Python-klasse is de daadwerkelijke modelimplementatie — beide zijn verwant maar niet hetzelfde.
- Veronderstellen dat elk model een ir.model-record heeft is fout. Abstracte modellen creëren geen database-tabellen en dus doorgaans geen ir.model-vermelding.
- Vergeten dat transient modellen tijdelijk zijn kan pijnlijke gevolgen hebben. Data in transient modellen wordt opgeschoond; gebruik ze niet voor blijvende opslag.
- ir.model onbeperkt bevragen zonder filter is onhandig: een gemiddelde Odoo-installatie telt honderden modellen. Filter altijd op modelnaam of gebruik zoekdomeinen.
Samenvatting
Het ir.model-model is het centrale register van alle Odoo-modellen. Het bewaart metadata over elk model en vormt samen met ir.model.fields het navigatieknooppunt voor de Odoo-data-architectuur.
Of je nu als consultant door Technische instellingen bladert of als ontwikkelaar een API-integratie bouwt: kennis van ir.model bespaart tijd en voorkomt fouten.
Hulp nodig met je Odoo-implementatie?
Dasolo ondersteunt bedrijven bij implementatie, maatwerk en optimalisatie van Odoo. We specialiseren ons in API-integraties en ontwikkeling, met diepe kennis van de Odoo-data-architectuur en modellen zoals ir.model.
Heb je hulp nodig bij je Odoo-implementatie, maatwerk of integraties? Wij staan klaar om te helpen. Plan een demo om je project te bespreken.