Chapter 3: Models And Basic Fields

At the end of the previous chapter, we were able to create an Odoo module. However, at this point it is still an empty shell which doesn’t allow us to store any data. In our real estate module, we want to store the information related to the properties (name, description, price, living area…) in a database. The Odoo framework provides tools to facilitate database interactions.

Mielőtt továbblépne a gyakorlatban, győződjön meg róla, hogy az estate modul telepítve van, azaz «Telepítve» kell megjelennie az Alkalmazások listájában.

Figyelem

Ne használjon módosítható globális változókat.

Egyetlen Odoo példány több adatbázist is futtathat párhuzamosan ugyanabban a python folyamatban. Különböző modulok lehetnek telepítve ezekre az adatbázisokra, ezért nem támaszkodhatunk globális változókra, amelyek a telepített moduloktól függően frissülnének.

Objektum-relációs leképezés

Referencia: a témával kapcsolatos dokumentáció megtalálható a Modellek API-ban.

Megjegyzés

Cél: ennek a szakasznak a végére az estate_property táblát létre kell hozni:

$ psql -d rd-demo
rd-demo=# SELECT COUNT(*) FROM estate_property;
count
-------
    0
(1 row)

Az Odoo egyik kulcsfontosságú eleme az ORM réteg. Ez a réteg elkerüli, hogy manuálisan kelljen írni a legtöbb SQL-t, és kiterjeszthetőségi és biztonsági szolgáltatásokat nyújt2.

Az üzleti objektumok Python osztályokként vannak deklarálva, amelyek kiterjesztik a Model osztályt, így integrálva őket az automatizált perzisztencia rendszerbe.

A modellek konfigurálhatók az attribútumok beállításával a definíciójukban. A legfontosabb attribútum a _name, amely kötelező, és meghatározza a modell nevét az Odoo rendszerben. Íme egy minimális modell definíció:

from odoo import models

class TestModel(models.Model):
    _name = "test_model"

Ez a definíció elegendő az ORM számára, hogy létrehozzon egy test_model nevű adatbázis táblát. Konvenció szerint minden modell a models könyvtárban található, és minden modell saját Python fájlban van definiálva.

Nézze meg, hogyan van definiálva a crm_recurring_plan tábla, és hogyan van importálva a megfelelő Python fájl:

  1. A modell a crm/models/crm_recurring_plan.py fájlban van definiálva (lásd itt)

  2. A crm_recurring_plan.py fájl importálva van a crm/models/__init__.py fájlban (lásd itt)

  3. A models mappa importálva van a crm/__init__.py fájlban (lásd itt)

Exercise

Határozza meg az ingatlan modelleket.

A CRM modulban adott példa alapján hozza létre a megfelelő fájlokat és mappát az estate_property táblához.

Amikor a fájlok létrejöttek, adjon meg egy minimális definíciót az estate.property modellhez.

A Python fájlok bármilyen módosítása megköveteli az Odoo szerver újraindítását. Amikor újraindítjuk a szervert, hozzáadjuk a -d és -u paramétereket:

$ ./odoo-bin --addons-path=addons,../enterprise/,../tutorials/ -d rd-demo -u estate

A -u estate azt jelenti, hogy frissíteni szeretnénk az estate modult, azaz az ORM alkalmazza az adatbázis séma változásait. Ebben az esetben új táblát hoz létre. A -d rd-demo azt jelenti, hogy a frissítést az rd-demo adatbázison kell végrehajtani. A -u mindig a -d-vel együtt használandó.

Az indítás során a következő figyelmeztetéseket kell látnia:

...
WARNING rd-demo odoo.models: The model estate.property has no _description
...
WARNING rd-demo odoo.modules.loading: The model estate.property has no access rules, consider adding one...
...

Ha ez a helyzet, akkor minden rendben van! A biztosíték kedvéért ellenőrizze a psql-lel, ahogy a Cél részben bemutatott.

Exercise

Adjon hozzá egy leírást.

Adjon hozzá egy _description-t a modelljéhez, hogy megszabaduljon az egyik figyelmeztetéstől.

Modell mezők

Hivatkozás: a témával kapcsolatos dokumentáció megtalálható a Mezők API-ban.

A mezők arra szolgálnak, hogy meghatározzák, mit tárolhat a modell és hol tárolódnak. A mezőket attribútumként definiálják a modell osztályban:

from odoo import fields, models

class TestModel(models.Model):
    _name = "test_model"
    _description = "Test Model"

    name = fields.Char()

A name mező egy Char, amely Python unicode str-ként és SQL VARCHAR-ként lesz ábrázolva.

Típusok

Megjegyzés

Cél: ennek a szakasznak a végére több alapvető mezőt kell hozzáadni az estate_property táblához:

$ psql -d rd-demo

rd-demo=# \d estate_property;
                                            Table "public.estate_property"
    Column       |            Type             | Collation | Nullable |                   Default
--------------------+-----------------------------+-----------+----------+---------------------------------------------
id                 | integer                     |           | not null | nextval('estate_property_id_seq'::regclass)
create_uid         | integer                     |           |          |
create_date        | timestamp without time zone |           |          |
write_uid          | integer                     |           |          |
write_date         | timestamp without time zone |           |          |
name               | character varying           |           |          |
description        | text                        |           |          |
postcode           | character varying           |           |          |
date_availability  | date                        |           |          |
expected_price     | double precision            |           |          |
selling_price      | double precision            |           |          |
bedrooms           | integer                     |           |          |
living_area        | integer                     |           |          |
facades            | integer                     |           |          |
garage             | boolean                     |           |          |
garden             | boolean                     |           |          |
garden_area        | integer                     |           |          |
garden_orientation | character varying           |           |          |
Indexes:
    "estate_property_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
    "estate_property_create_uid_fkey" FOREIGN KEY (create_uid) REFERENCES res_users(id) ON DELETE SET NULL
    "estate_property_write_uid_fkey" FOREIGN KEY (write_uid) REFERENCES res_users(id) ON DELETE SET NULL

Két fő kategóriája van a mezőknek: «egyszerű» mezők, amelyek atomikus értékek, közvetlenül a modell táblájában tárolva, és «relációs» mezők, amelyek rekordokat kapcsolnak össze (ugyanazon vagy különböző modellekből).

Egyszerű mező példák: Boolean, Float, Char, Text, Date és Selection.

Exercise

Adjon hozzá alapvető mezőket az Ingatlan tábla számára.

Adja hozzá a következő alapvető mezőket a táblához:

Mező

Típus

név

Karakter

leírás

Szöveg

irányítószám

Karakter

elérhetőség_dátuma

Dátum

várható_ár

Lebegőpontos szám

eladási_ár

Lebegőpontos szám

hálószobák

Egész szám

lakóterület

Egész szám

homlokzatok

Egész szám

garázs

Logikai

kert

Logikai

kert_terület

Egész szám

kert_tájolás

Kiválasztás

A garden_orientation mezőnek 4 lehetséges értéke kell legyen: «Észak», «Dél», «Kelet» és «Nyugat». A választási lista egy tuple lista formájában van meghatározva, példát lásd itt.

Amikor a mezők hozzáadásra kerülnek a modellhez, indítsa újra a szervert a -u estate opcióval

$ ./odoo-bin --addons-path=addons,../enterprise/,../tutorials/ -d rd-demo -u estate

Csatlakozzon a psql-hoz, és ellenőrizze az estate_property tábla szerkezetét. Észre fogja venni, hogy néhány extra mező is hozzáadásra került a táblához. Később visszatérünk rájuk.

Gyakori attribútumok

Megjegyzés

Cél: ennek a szakasznak a végére a name és expected_price oszlopok nem lehetnek null értékűek az estate_property táblában:

rd-demo=# \d estate_property;
                                            Table "public.estate_property"
    Column       |            Type             | Collation | Nullable |                   Default
--------------------+-----------------------------+-----------+----------+---------------------------------------------
...
name               | character varying           |           | not null |
...
expected_price     | double precision            |           | not null |
...

Hasonlóan magához a modellhez, a mezők is konfigurálhatók konfigurációs attribútumok paraméterként való átadásával:

name = fields.Char(required=True)

Néhány attribútum minden mezőnél elérhető, itt vannak a leggyakoribbak:

string (str, alapértelmezett: a mező neve)

A mező címkéje a felhasználói felületen (a felhasználók által látható).

required (bool, alapértelmezett: False)

Ha True, a mező nem lehet üres. Vagy alapértelmezett értékkel kell rendelkeznie, vagy mindig értéket kell kapnia, amikor rekordot hoz létre.

help (str, alapértelmezett: '')

Hosszú formájú súgó eszköztippet biztosít a felhasználók számára a felhasználói felületen.

index (bool, alapértelmezett: False)

Kéri, hogy az Odoo hozzon létre egy adatbázis indexet az oszlopon.

Exercise

Állítson be attribútumokat meglévő mezőkhöz.

Adja hozzá a következő attribútumokat:

Mező

Attribútum

név

kötelező

várható_ár

kötelező

A szerver újraindítása után mindkét mező nem lehet null értékű.

Automatikus mezők

Hivatkozás: a témával kapcsolatos dokumentáció megtalálható itt: Automatikus mezők.

Észrevehetted, hogy a modellednek van néhány mezője, amelyet soha nem definiáltál. Az Odoo néhány mezőt hoz létre minden modellben1. Ezeket a mezőket a rendszer kezeli, és nem lehet rájuk írni, de olvashatók, ha hasznos vagy szükséges:

id (Id)

A modell rekordjának egyedi azonosítója.

create_date (Datetime)

A rekord létrehozásának dátuma.

create_uid (Many2one)

A rekordot létrehozó felhasználó.

write_date (Datetime)

A rekord utolsó módosításának dátuma.

write_uid (Many2one)

A felhasználó, aki utoljára módosította a rekordot.

Now that we have created our first model, let’s add some security!

1

lehetséges bizonyos mezők automatikus létrehozásának letiltása

2

nyers SQL lekérdezések írása lehetséges, de óvatosságot igényel, mivel ez megkerüli az Odoo összes hitelesítési és biztonsági mechanizmusát.