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.typemodellnek kell létrejönnie a megfelelő menüvel, akcióval és nézetekkel.
három Many2one mezőt kell hozzáadni az
estate.propertymodellhez: ingatlan típus, vevő és eladó.
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
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.typemodellt, é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_idinto yourestate.propertymodel 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.crvagyself._craz adatbázis kurzor objektuma; az adatbázis lekérdezésére használjákA
self.env.uidvagyself._uidaz aktuális felhasználó adatbázis azonosítójaA
self.env.useraz aktuális felhasználó rekordjaA
self.env.contextvagyself._contexta kontextus szótárself.env.ref(xml_id)visszaadja az XML azonosítóhoz tartozó rekordotself.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.tagmodell létrehozása szükséges a megfelelő menüvel és akcióval.
címkéket kell hozzáadni az
estate.propertymodellhez:
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.tagmodellt, é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_idsto yourestate.propertymodel 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.offermodel should be created with the corresponding form and list view.ajánlatokat kell hozzáadni az
estate.propertymodellhez:
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.offermodellt, é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 ( |
kötelező |
|
property_id |
Many2one ( |
kötelező |
Create a list view and a form view with the
price,partner_idandstatusfields. No need to create an action or a menu.Adja hozzá az
offer_idsmezőt azestate.propertymodelljé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 ;-)