Siirry sisältöön

Odoo One2many-kenttä: Täydellinen Opas

Ymmärrys One2many-kentästä Odoossa — mitä se on, milloin se kannattaa valita ja miten sen mallinnus tehdään oikein One2many-kenttä yhdistää taulukoita niin, että yksi päätietue voi sisältää useita liittyviä rivejä. Kuvittele pääkirjanpitotili, jolla on monta tapahtumariviä, tai tuoteryhmä, jonka alla on useita tuotteita: One2many on nimenomaan tätä tyyppiä oleva suhde. Se ei itsessään säilytä tietoa rivien sisällöstä vaan pitää linkin päärekisteristä ja sen moniin alipostauksiin. Milloin valita One2many? Valitse se, kun haluat esitellä tai hallita useaa alkiota yhdestä näkymästä, ja kun alipöytä on luonteeltaan osa pääentiteettiä. Esimerkkejä: laskurivit yhdellä laskulla, työtehtävät yhdellä projektilla tai tuotekuvat yhdellä tuotteella. Jos taas samaa alielementtiä käytetään itsenäisesti eri paikoissa, kannattaa harkita Many2one- tai Many2many-suhdetta. Miten toteutus Odoossa etenee käytännössä? Mallissa määritellään One2many-kenttä, joka viittaa toisen mallin Many2one-kenttään. Keskeinen osa on oikea relation-parametri: se kertoo lapsimallin nimen ja sen kentän, joka osoittaa takaisin vanhempaan. Lisäksi kannattaa huomioida näkymät — form- ja tree-/kanban-esitykset — sekä käyttöoikeudet ja suorituskyky, jos lapsirivejä voi olla paljon. Suunnitteluvinkkejä ja hyvät käytännöt - Pidä tietomalli selkeänä: yhden suunnan omistus (parent owns children) helpottaa elinkaarihallintaa. - Harkitse automaattista rivien luontia tai poistoa riippuen liiketoimintalogiikasta. - Optimoi luku- ja kirjoitusoperaatiot, jos lapsirivejä odotetaan olevan satoja tai tuhansia. - Käytä kontekstissa oikeita näkymäelementtejä (editable tree, notebook tms.) parhaan käyttökokemuksen saavuttamiseksi. Yhteenveto: One2many on luonnollinen valinta, kun haluat mallintaa yhden kohteen ja sen montaa osa-aluetta näkyvästi yhdessä paikassa. Oikein asetettuna se tarjoaa joustavan tavan hallita hierarkkisia tietoja Odoo-järjestelmässä.
6. maaliskuuta 2026 kirjoittanut
Odoo One2many-kenttä: Täydellinen Opas
Dasolo
| Ei vielä kommentteja

Johdanto


Jos olet koskaan avannut Odoossa myyntitilausta ja nähnyt tilaukselle listatut rivit asiakkaan tietojen alla, olet käytännössä nähnyt One2many‑kenttää toiminnassa. Se on yksi järjestelmän keskeisistä rakennuspalikoista, ja sen periaatteiden ymmärtäminen on oleellista niin muokkauksia tekeville kuin käyttäjillekin.


Tässä oppaassa käyn läpi, mikä One2many‑kenttä on, miten Odoon ORM käsittelee sitä, millaisissa tilanteissa sitä kannattaa hyödyntää, ja miten kentän voi lisätä joko Odoo Studiolla tai suoraan Python‑koodissa.

Olitpa yrityskäyttäjä joka haluaa hahmottaa tietomallin rakennetta tai kehittäjä joka tarvitsee käytännön ohjeita Odoo‑kenttien kanssa, tämän artikkelin tiedot auttavat sinua eteenpäin.

Mikä on One2many-kenttä Odoossa


One2many on relaatiokenttä Odoo‑kehikossa: sen avulla yksi pääkirja‑ eli vanhempaarekisteri voi liittyä moneen alipostaukseen tai lapsirekisteriin toisessa mallissa.


Ajattele niin, että yhdellä asiakkaalla voi olla monta laskua. Yhdessä myyntitilauksessa voi olla monta riviä. Yhdestä projektista voi löytyä useita tehtäviä. One2many kokoaa nämä lapsirekisterit vanhemman yhteyteen ja näyttää ne yhtenä listana.


Käyttöliittymässä One2many näkyy yleensä lomakkeessa upotettuna taulukkona tai listana, jossa voi lisätä, muokata ja poistaa lapsirivejä ilman, että tarvitsee hypätä pois vanhemparekisterin näkymästä. Siksi se on yksi Odoon näkyvimmistä ja eniten käytetyistä elementeistä.


Miten se eroaa muista relaatiokentistä

Odoon ORM:ssä on kolme pääasiallista relaatiotyyppiä:


  • Many2one: yksittäinen kenttä joka osoittaa yhteen toisen mallin rekisteriin (esimerkiksi myyntitilaus osoittaa yhteen asiakkaaseen).
  • One2many: yksi vanhempi yhdistää monta laskua tai riviä toiseen malliin (esimerkiksi myyntitilaus ja sen rivit).
  • Many2many: molemmat puolet voivat linkittyä moneen rekisteriin samaan aikaan (esimerkiksi tuote ja tunnisteet).

One2many sopii tilanteisiin, joissa lapsirekisteri kuuluu aina täsmälleen yhdelle vanhemmalle. Jos saman lapsen pitää olla useamman vanhemman alla, kannattaa käyttää Many2many‑ratkaisua.


Erityispiirre on se, että One2many ei itsessään tallenna saraketta vanhemman tauluun. Se on virtuaalinen näkymä, joka hakee tiedot lapsimallista käyttäen lapsella olevaa Many2one‑kenttää.

Miten kenttä toimii


Tietokantatasolla One2many‑kenttää ei ole sijoitettu vanhemman taulun sarakkeeksi. Sen sijaan lapsitaulussa on vierasavain‑sarakkeena viittaus vanhempaan, ja One2many vain kokoaa nämä rivit yhteen näkymään.


Odoon ORM:ssa periaatteena on, että jokaisella One2many‑kentällä on vastinkenttänä Many2one lapsimallissa. One2many on ikään kuin käänteiskysely: Odoo etsii kaikki lapsirivit, joissa lapsen Many2one‑kentän arvo vastaa tämänhetkisen vanhemman ID:tä.


Suhde One2many:n ja Many2one:n välillä

Kun määrittelet One2many‑kentän Pythonissa, tarvitset kaksi tärkeää parametria:


  • comodel_name: lapsimalli, joka sisältää liittyvät rivit.
  • inverse_name: lapsimallin Many2one‑kentän nimi, joka osoittaa takaisin vanhempaan.

Seuraava yksinkertainen esimerkki näyttää, miten palvelusopimus voi sisältää useita toimituseriä (deliverables):


deliverable_ids = fields.One2many(
    comodel_name='service.deliverable',
    inverse_name='contract_id',
    string='Deliverables'
)

Tässä contract_id on lapsimallin Many2one‑kenttä, joka osoittaa sopimukseen. Ilman sitä One2many‑kenttä ei pysty tekemään takaisinviittausta eikä toimi oikein.


Mitä tietokannassa tapahtuu

Tietokannassa One2many‑kentän tiedot sijaitsevat lapsitaulussa: jokainen lapsirivi sisältää vierasavaimen, joka osoittaa vanhemparekisterin tunnukseen, eikä vanhemman tauluun lisätä uutta saraketta.

Kun Odoo lataa vanhemman ja näyttää sen One2many‑listan, ORM suorittaa taustalla haun lapsitaulusta: valitse kaikki rivit, joiden vierasavain vastaa tämän vanhemman ID:tä. Tämä on normaalia relaatiotietokannan toimintaa, jota Odoo hoitaa automaattisesti.


Tästä syystä One2many‑kenttiä pidetään laskettuna näkymänä liittyvistä rekistereistä, eivät kenttinä jotka muokkaavat vanhemman tietokantarakennetta.

Liiketoiminnan käyttötapaukset


One2many‑kenttiä käytetään laajasti, koska ne mallintavat luonnollisesti vanhempi‑lapsi‑suhteita. Tässä viisi käytännön esimerkkiä arjen prosesseista.


1. Myyntitilaukset ja rivit

Myyntimoduulissa myyntitilauksella on One2many‑kenttä order_line_ids, joka linkittää tilaukseen kuuluvat rivit. Jokaisella rivillä on tuote, määrä, yksikköhinta ja mahdollinen alennus. Käyttäjä voi lisätä tai poistaa rivejä suoraan tilauslomakkeelta.


2. Laskut ja laskurivit

Kirjanpidossa laskumallissa account.move on One2many‑kenttä, joka hallinnoi laskurivejä (account.move.line). Jokainen rivi kuvaa veloitettavaa tuotetta tai palvelua, ja lasku kokoaa rivien summat yhteen.


3. Projektit ja tehtävät

Projektimoduulissa projektille on One2many‑kenttä, joka listaa kaikki projektiin kuuluvat tehtävät. Lomakkeessa nämä voivat näkyä luettelona, kanbanina tai Ganttina — sama suhde ajaa eri näkymiä taustalla.


4. Yhteystiedot ja alayhteystiedot

Res.partner‑mallissa on child_ids One2many, joka listaa yritykseen liittyvät yksittäiset yhteyshenkilöt. Jokaisella alayhteystiedolla on parent_id‑Many2one, joka osoittaa takaisin yritykseen.


5. Räätälöidyt mallit palveluissa tai valmistuksessa

Kun rakennat omaa moduulia, One2many on luonnollinen valinta tilanteisiin, joissa yksi tietue omistaa joukon alipostauksia, kuten huoltopyyntö ja siihen liittyvät varaosat, koulutus ja sen eri ajankohdat tai sopimus ja sen toimituserät.


Tämä joustavuus tekee One2many‑kentästä tärkeän työkalun Odoon räätälöinnissä eri toimialojen tarpeisiin.

Kentän luominen tai muokkaaminen


One2many‑kentän voi lisätä kahdella päämenetelmällä: Odoo Studiolla ilman koodausta tai kehittäjän tekemänä Python‑määrittelynä.


Käyttäminen Odoo Studiolla

Studio‑työkalulla et yleensä luo One2many‑kenttää suoraan vanhemmalle ilman että lapsimalliin on ensin lisätty Many2one. Syynä on se, että One2many tarvitsee aina olemassa olevan inverse‑kentän lapsella.

Suositeltu työnkulku Studiolla on seuraava:

  1. avaa lapsimalli ja lisää siihen Many2one‑kenttä joka osoittaa vanhempaan.
  2. tallenna lapsimallin kenttä ja palaa vanhempamallin muokkaustilaan.
  3. lisää uusi kenttä, valitse tyyppi One2many ja valitse siihen liittyvä malli sekä inverse‑kentän nimi.
  4. Kun nämä askeleet on tehty, One2many ilmestyy lomakkeeseen upotettuna listana.

Monille liiketoiminnan käyttäjille tämä on helpoin tapa rakentaa One2many‑suhteita ilman koodausta. Studio‑kentät käyttäytyvät samalla tavalla kuin Pythonissa määritellyt kentät.


Käyttäminen Python‑koodilla omassa moduulissa

Kehittäjälle One2many:n määrittely Pythonissa antaa täyden kontrollin kentän nimeämisestä, toiminnallisuudesta ja esimerkiksi domain‑suodattimista. Tässä täydellinen esimerkki moduulista:


from odoo import fields, models

class ServiceContract(models.Model):
    _name = 'service.contract'
    _description = 'Service Contract'

    name = fields.Char(string='Contract Name', required=True)
    deliverable_ids = fields.One2many(
        comodel_name='service.deliverable',
        inverse_name='contract_id',
        string='Deliverables'
    )


class ServiceDeliverable(models.Model):
    _name = 'service.deliverable'
    _description = 'Service Deliverable'

    contract_id = fields.Many2one(
        comodel_name='service.contract',
        string='Contract',
        ondelete='cascade'
    )
    name = fields.Char(string='Description', required=True)

Huomaa, että lapsimallin Many2one‑kenttä (contract_id) määritellään ensin ja One2many:n inverse_name viittaa siihen täsmällisesti — nimet on oltava identtiset.


Kentän luominen XML‑RPC‑rajapinnalla

Jos hallinnoit kenttiä ohjelmallisesti, voit luoda One2many‑kentän myös XML‑RPC:llä muokkaamalla ir.model.fields‑tietueita. Kuten aina, prosessi edellyttää että Many2one‑kenttä on olemassa ja One2many määritellään viittaamaan siihen relation_field‑parametrilla.


Tämä on kätevä tapa automatisoida kenttien luontia useissa ympäristöissä tai hoitaa kenttämuutokset ohjelmallisesti.

Parhaat käytännöt


Käytännön kokemukseen perustuvat parhaat toimintatavat One2many‑kenttien kanssa työskentelyyn.


  • Lisää aina ensin Many2one. One2many ei voi toimia ilman sen inverse‑kenttää. Olitpa Studio‑käyttäjä, kehittäjä tai skriptin kirjoittaja, varmista että lapsen Many2one on luotuna ennen One2manyn määrittelyä.
  • Käytä _ids-päätettä kentän nimissä. Odoon käytännöksi on vakiintunut One2many‑kenttien nimeäminen muodossa xxx_ids (esim. line_ids, task_ids), jolloin koodista näkee heti että kyseessä on moni‑arvoinen kenttä.
  • Aseta ondelete='cascade' tarpeen mukaan. Jos haluat, että lapsirivit poistuvat automaattisesti vanhemman poiston yhteydessä, määrittele tämä lapsen Many2one‑kenttään. Näin vältät orpojen rivien kertymisen tietokantaan.
  • Pidä upotettu lista selkeänä. Näytä One2many‑listassa vain tärkeimmät sarakkeet. Liian moni sarake tekee näkymästä hitaan ja sekavan. Käytä vaihtoehtoisesti optio‑sarakkeita, jotka käyttäjä voi tarvittaessa avata.
  • Käytä domaineja rajaamaan näkyviä lapsirivejä. One2many:hin voi lisätä domain‑ehdon, jolla rajoitetaan mitä lapsirivejä näytetään — hyödyllistä erityisesti, jos lapsimalli on jaettu useiden vanhempien kesken.
  • Käsittele suuria tietomääriä huolellisesti. Jos yhdellä vanhemmalla voi olla tuhansia lapsirivejä, älä lataa niitä kaikkia lomakkeeseen kerralla. Harkitse erillistä listanäkymää, sivutusta tai rajausta suorituskyvyn säilyttämiseksi.

Yleisimmät kompastuskivet


Usein toistuvat virheet One2many‑kenttien kanssa ja miten ne voi välttää.


Inverse‑Many2one unohtuu

Yleisimmän virheen aiheuttaa One2manyn luominen ilman että lapsella on olemassa oleva Many2one. Tämä johtaa virheilmoituksiin. Varmista aina, että inverse_name on olemassa ja kirjoitettu oikein lapsimallissa.


Väärä kirjoitustapa päivityksissä

Kun päivität One2many‑kenttää koodilla tai API:lla, käytä Odoon komentotupleja — et voi vain asettaa tavallista Python‑listaa. Oikeat operaatiot näyttävät tältä:


  • (0, 0, values_dict) luodaksesi uuden lapsirivin.
  • (1, child_id, values_dict) päivittääksesi olemassa olevaa lapsiriviä.
  • (2, child_id, 0) poistaaksesi lapsirivin (ja sen tietokannasta).
  • (4, child_id, 0) lisätäksesi olemassa olevan lapsirivin suhteeseen ilman uudelleenluontia.
  • (5, 0, 0) irrottaaksesi kaikki lapsirivit vanhemmasta (ilman poistoa).

Yritäminen kirjoittaa suoraa listaa kuten record.line_ids = [1, 2, 3] ei toimi Odoon ORM:ssä ja tuottaa virheellisiä tuloksia.


One2manyn ja Many2manyn sekoittaminen

Muista, että One2many tarkoittaa yksinkertaista omistussuhdetta: lapsi kuuluu vain yhdelle vanhemmalle. Jos tarvitset saman lapsen liittyvän useaan vanhempaan samanaikaisesti, valitse Many2many — väärä valinta johtaa tietojen duplikaatioon ja eheysongelmiin.


Suorituskykyongelmat suurissa listoissa

Jos One2many esittää satoja tai tuhansia rivejä suoraan lomakkeessa, sivun lataus hidastuu merkittävästi. Tämä on tavallista esimerkiksi laskurivien tai varastosiirtojen kohdalla. Käytä listan limit‑asetusta tai ohjaa käyttäjät erilliseen listanäkymään suurissa kokonaisuuksissa.


Orpokirjaukset poiston jälkeen

Jos vanhempi poistetaan ilman että lapsen Many2one on määritelty ondelete='cascade', lapsirivit voivat jäädä tietokantaan ilman kelvollista viittausta. Ajan myötä tämä sotkee tietokantaa ja voi aiheuttaa virhetilanteita raporteissa ja näkymissä. Määrittele selkeä poisto‑politiikka suunnitteluvaiheessa.

Yhteenveto


One2many on olennainen osa Odoon tietomallia ja ORM:ää. Se mahdollistaa monia keskeisiä toiminnallisuuksia, kuten myyntirivit, laskurivit ja projektitehtävät. Kun ymmärrät One2manyn ja sen suhteen lapsen Many2one‑kenttään, Odoon rakenteiden lukeminen ja laajentaminen muuttuu huomattavasti helpommaksi.


Olipa kyse Odoon konfiguroinnista, Studio‑muokkauksesta tai räätälöidyn moduulin rakentamisesta, One2many on työkalu jonka kanssa tulet tekemään töitä usein. Oikein käytettynä se säästää aikaa ja estää monia tiedonhallinnan sudenkuoppia.

Jos haluat lisää oppaita Odoon kentistä ja API‑käytännöistä, tutustu Odoo Data & API -kokoelman muihin artikkeleihin.

Tarvitsetko apua Odoo‑projektissasi?


Dasolo auttaa yrityksiä ottamaan Odoon käyttöön, räätälöimään ja optimoimaan sitä liiketoimintatarpeiden mukaan. Autamme tietomallin suunnittelussa, lisäosien rakentamisessa, kenttien luonnissa ja olemassa olevan ympäristön hyödyntämisessä tehokkaammin.

Jos sinulla on kysymyksiä liittyen Odoo‑projektiisi tai haluat keskustella tietomallin rakenteesta, ota yhteyttä meihin— autamme mielellämme.

Odoo One2many-kenttä: Täydellinen Opas
Dasolo 6. maaliskuuta 2026
Jaa tämä kirjoitus
Kirjaudu sisään jättääksesi kommentin