Chapter 7: Relations Between Models

The previous chapter covered the creation of custom views for a model containing basic fields. However, in any real business scenario we need more than one model. Moreover, links between models are necessary. One can easily imagine one model containing the customers and another one containing the list of users. You might need to refer to a customer or a user on any existing business model.

Az ingatlan modulunkban a következő információkat szeretnénk egy ingatlanhoz:

  • az ügyfél, aki megvásárolta az ingatlant

  • az ingatlanügynök, aki eladta az ingatlant

  • az ingatlan típusa: ház, lakás, penthouse, kastély…

  • az ingatlant jellemző címkék listája: otthonos, felújított…

  • a beérkezett ajánlatok listája

Many2one

Referencia: a témához kapcsolódó dokumentáció megtalálható itt: Many2one.

Megjegyzés

Cél: ennek a szakasznak a végén:

  • egy új estate.property.type modellnek kell létrejönnie a megfelelő menüvel, akcióval és nézetekkel.

Ingatlan típus
  • három Many2one mezőt kell hozzáadni az estate.property modellhez: ingatlan típus, vevő és eladó.

Ingatlan

Ingatlan modulunkban szeretnénk meghatározni az ingatlan típus fogalmát. Egy ingatlan típus például lehet ház vagy lakás. Ez egy szokásos üzleti igény, hogy az ingatlanokat típusuk szerint kategorizáljuk, különösen a szűrés finomítása érdekében.

Egy ingatlannak egy típusa lehet, de ugyanaz a típus sok ingatlanhoz rendelhető. Ezt a many2one koncepció támogatja.

A many2one egy egyszerű kapcsolat egy másik objektumhoz. Például, ha egy kapcsolatot szeretnénk definiálni a res.partner-hez a teszt modellünkben, akkor írhatjuk:

partner_id = fields.Many2one("res.partner", string="Partner")

Konvenció szerint a many2one mezők _id utótaggal rendelkeznek. Az adatok elérése a partnerben ezután könnyen elvégezhető:

print(my_test_object.partner_id.name)

Lásd még

idegen kulcsok

Gyakorlatban a many2one egy legördülő listaként jelenik meg egy űrlap nézetben.

Exercise

Adja hozzá az Ingatlan Típus táblát.

  • Hozza létre az estate.property.type modellt, és adja hozzá a következő mezőt:

Mező

Típus

Attribútumok

név

Karakter

kötelező

  • Adja hozzá a menüket, ahogy ebben a szakaszban a Cél részben látható

  • Add the field property_type_id into your estate.property model and its form, list and search views

This exercise is a good recap of the previous chapters: you need to create a model, set the model, add an action and a menu, and create a view.

Tipp: ne felejtsd el importálni az új Python fájlokat a __init__.py-ban, hozzáadni az új adatfájlokat a __manifest.py__-ban, vagy hozzáadni a hozzáférési jogokat ;-)

Ismételten indítsd újra a szervert és frissítsd az oldalt, hogy lásd az eredményeket!

Az ingatlan modulban még mindig hiányzik két információ, amit szeretnénk egy ingatlanhoz hozzáadni: a vevő és az értékesítő. A vevő bármely egyén lehet, de az értékesítőnek az ingatlanközvetítő ügynökség alkalmazottjának kell lennie (azaz egy Odoo felhasználónak).

Az Odoo-ban két modellt szoktunk említeni:

  • res.partner: egy partner lehet fizikai vagy jogi személy. Lehet cég, egyén vagy akár egy kapcsolattartási cím is.

  • res.users: a rendszer felhasználói. A felhasználók lehetnek «belső» felhasználók, azaz hozzáférésük van az Odoo háttérhez. Vagy lehetnek «portál» felhasználók, azaz nem férnek hozzá a háttérhez, csak az előtérhez (pl. hogy hozzáférjenek korábbi rendeléseikhez az eCommerce-ben).

Exercise

Add hozzá a vevőt és az értékesítőt.

Adj hozzá egy vevőt és egy értékesítőt az estate.property modellhez a fent említett két közös modell használatával. Ezeket egy új fülön kell hozzáadni az űrlap nézetben, ahogy azt ennek a szakasznak a Célja ábrázolja.

Az értékesítő alapértelmezett értéke a jelenlegi felhasználó kell legyen. A vevőt nem szabad másolni.

Tipp: az alapértelmezett érték megszerzéséhez nézd meg az alábbi megjegyzést vagy egy példát itt.

Megjegyzés

Az objektum self.env hozzáférést biztosít a kérés paramétereihez és más hasznos dolgokhoz:

  • A self.env.cr vagy self._cr az adatbázis kurzor objektuma; az adatbázis lekérdezésére használják

  • A self.env.uid vagy self._uid az aktuális felhasználó adatbázis azonosítója

  • A self.env.user az aktuális felhasználó rekordja

  • A self.env.context vagy self._context a kontextus szótár

  • self.env.ref(xml_id) visszaadja az XML azonosítóhoz tartozó rekordot

  • self.env[model_name] visszaadja a megadott modell példányát

Most nézzük meg a linkek más típusait.

Many2many

Referencia: a témával kapcsolatos dokumentáció megtalálható a Many2many osztályban.

Megjegyzés

Cél: ennek a szakasznak a végén:

  • egy új estate.property.tag modell létrehozása szükséges a megfelelő menüvel és akcióval.

Ingatlan címke
  • címkéket kell hozzáadni az estate.property modellhez:

Ingatlan

Ingatlan modulunkban szeretnénk meghatározni az ingatlan címkék fogalmát. Egy ingatlan címke például lehet «hangulatos» vagy «felújított».

Egy ingatlannak sok címkéje lehet, és egy címke sok ingatlanhoz rendelhető. Ezt a many2many koncepció támogatja.

A many2many egy kétirányú többszörös kapcsolat: bármelyik oldalon lévő rekord bármennyi rekordhoz kapcsolódhat a másik oldalon. Például, ha egy linket szeretnénk meghatározni az account.tax modellhez a teszt modellünkön, írhatjuk:

tax_ids = fields.Many2many("account.tax", string="Taxes")

Konvenció szerint a many2many mezők _ids utótaggal rendelkeznek. Ez azt jelenti, hogy több adó is hozzáadható a teszt modellünkhöz. Úgy viselkedik, mint egy rekordlista, ami azt jelenti, hogy az adatok elérését ciklusban kell végezni:

for tax in my_test_object.tax_ids:
    print(tax.name)

A rekordok listája recordset-ként ismert, azaz egy rendezett rekordgyűjtemény. Támogatja a szokásos Python műveleteket a gyűjteményeken, mint például a len() és iter(), valamint extra halmazműveleteket, mint a recs1 | recs2.

Exercise

Adja hozzá az Ingatlan Tulajdonság Címke táblát.

  • Hozza létre az estate.property.tag modellt, és adja hozzá a következő mezőt:

Mező

Típus

Attribútumok

név

Karakter

kötelező

  • Adja hozzá a menüket, ahogy ebben a szakaszban a Cél részben látható

  • Add the field tag_ids to your estate.property model and in its form and list views

Tip: in the view, use the widget="many2many_tags" attribute as demonstrated here. The widget attribute will be explained in detail in a later chapter of the training. For now, you can try adding and removing it and see the result ;-)

One2many

Referencia: a témához kapcsolódó dokumentáció megtalálható a One2many osztályban.

Megjegyzés

Cél: ennek a szakasznak a végén:

  • a new estate.property.offer model should be created with the corresponding form and list view.

  • ajánlatokat kell hozzáadni az estate.property modellhez:

Ingatlan ajánlatok

Ingatlan modulunkban szeretnénk meghatározni az ingatlan ajánlatok fogalmát. Egy ingatlan ajánlat az az összeg, amelyet egy potenciális vevő ajánl az eladónak. Az ajánlat lehet alacsonyabb vagy magasabb a várható árnál.

Egy ajánlat egy ingatlanra vonatkozik, de ugyanarra az ingatlanra sok ajánlat is érkezhet. A many2one fogalma ismét megjelenik. Azonban ebben az esetben azt szeretnénk, hogy megjelenjen az ajánlatok listája egy adott ingatlanhoz, ezért a one2many fogalmat fogjuk használni.

A one2many a many2one inverze. Például, a teszt modellünkön meghatároztunk egy kapcsolatot a res.partner modellel a partner_id mezőnek köszönhetően. Meghatározhatjuk az inverz kapcsolatot is, azaz a partnerünkhöz kapcsolódó teszt modellek listáját:

test_ids = fields.One2many("test_model", "partner_id", string="Tests")

Az első paramétert comodel-nek hívják, a második paraméter pedig az a mező, amelyet inverzálni szeretnénk.

Konvenció szerint a one2many mezők _ids utótaggal rendelkeznek. Úgy viselkednek, mint egy rekordlista, ami azt jelenti, hogy az adatok elérését ciklusban kell végrehajtani:

for test in partner.test_ids:
    print(test.name)

Veszély

Mivel a One2many egy virtuális kapcsolat, kell lennie egy Many2one mezőnek a comodelben.

Exercise

Adja hozzá az Ingatlan Ajánlat táblát.

  • Hozza létre az estate.property.offer modellt, és adja hozzá a következő mezőket:

Mező

Típus

Attribútumok

Értékek

ár

Lebegőpontos szám

állapot

Kiválasztás

nincs másolat

Elfogadva, Elutasítva

partner_id

Many2one (res.partner)

kötelező

property_id

Many2one (estate.property)

kötelező

  • Create a list view and a form view with the price, partner_id and status fields. No need to create an action or a menu.

  • Adja hozzá az offer_ids mezőt az estate.property modelljéhez és annak űrlap nézetéhez, ahogyan ebben a szakaszban a Cél ábrázolja.

Itt több fontos dolgot is észre kell venni. Először is, nem minden modellhez van szükség akcióra vagy menüre. Néhány modellt csak egy másik modellen keresztül lehet elérni. Ez a helyzet a gyakorlatunkban: egy ajánlatot mindig egy ingatlanon keresztül érünk el.

Másodszor, annak ellenére, hogy a property_id mező kötelező, nem vettük fel a nézetekbe. Honnan tudja az Odoo, hogy melyik ingatlanhoz kapcsolódik az ajánlatunk? Nos, ez az Odoo keretrendszer használatának varázsának része: néha a dolgok implicit módon vannak meghatározva. Amikor egy rekordot hozunk létre egy one2many mezőn keresztül, a megfelelő many2one automatikusan kitöltődik a kényelem érdekében.

Still alive? This chapter is definitely not the easiest one. It introduced a couple of new concepts while relying on everything that was introduced before. The next chapter will be lighter, don’t worry ;-)