Chapter 10: Constraints¶
The previous chapter introduced the ability to add some business logic to our model. We can now link buttons to business code, but how can we prevent users from entering incorrect data? For example, in our real estate module nothing prevents users from setting a negative expected price.
Az Odoo két módot biztosít az automatikusan ellenőrzött invariánsok beállítására: Python korlátozások és SQL korlátozások.
SQL¶
Hivatkozás: a témához kapcsolódó dokumentáció megtalálható a Modellek és a PostgreSQL dokumentációjában.
Megjegyzés
Cél: ennek a szakasznak a végén:
Az összegeknek (szigorúan) pozitívnak kell lenniük
Az ingatlantípusoknak és címkéknek egyedi névvel kell rendelkezniük
Az SQL korlátozások a _sql_constraints modell attribútumon keresztül vannak meghatározva. Ez az attribútum egy hármasok listáját kapja, amelyek karakterláncokat tartalmaznak (név, sql_definíció, üzenet), ahol a név egy érvényes SQL korlátozás neve, az sql_definíció egy table_constraint kifejezés, és az üzenet a hibaüzenet.
Egy egyszerű példát találhat itt.
Exercise
Adjon hozzá SQL korlátozásokat.
Adja hozzá a következő korlátozásokat a megfelelő modellekhez:
Egy ingatlan várható árának szigorúan pozitívnak kell lennie
Az ingatlan eladási árának pozitívnak kell lennie
Az ajánlati árnak szigorúan pozitívnak kell lennie
Az ingatlan címke neve és az ingatlan típus neve egyedinek kell lennie
Tipp: keressen rá az unique kulcsszóra az Odoo kódbázisában az egyedi nevek példáiért.
Indítsa újra a szervert az -u estate opcióval, hogy lássa az eredményt. Vegye figyelembe, hogy lehetnek olyan adatok, amelyek megakadályozzák egy SQL megszorítás beállítását. Hasonló hibaüzenet jelenhet meg:
ERROR rd-demo odoo.schema: Table 'estate_property_offer': unable to add constraint 'estate_property_offer_check_price' as CHECK(price > 0)
Például, ha néhány ajánlat ára nulla, akkor a megszorítás nem alkalmazható. Törölheti a problémás adatokat az új megszorítások alkalmazásához.
Python¶
Referencia: a témával kapcsolatos dokumentáció megtalálható a constrains() részben.
Megjegyzés
Cél: ennek a szakasznak a végén nem lesz lehetséges olyan ajánlat elfogadása, amely alacsonyabb, mint a várható ár 90%-a.
Az SQL megszorítások hatékony módjai az adatok konzisztenciájának biztosításának. Azonban szükség lehet bonyolultabb ellenőrzésekre, amelyek Python kódot igényelnek. Ebben az esetben Python megszorításra van szükség.
A Python megszorítás egy olyan metódusként van definiálva, amelyet a constrains() dekorátorral láttak el, és egy rekordhalmazon kerül meghívásra. A dekorátor meghatározza, hogy mely mezők vesznek részt a megszorításban. A megszorítás automatikusan kiértékelésre kerül, amikor bármelyik mező módosul. A metódusnak kivételt kell dobnia, ha az invariáns nem teljesül:
from odoo.exceptions import ValidationError
...
@api.constrains('date_end')
def _check_date_end(self):
for record in self:
if record.date_end < fields.Date.today():
raise ValidationError("The end date cannot be set in the past")
# all records passed the test, don't return anything
Egy egyszerű példa található itt.
Exercise
Python megszorítások hozzáadása.
Adjon hozzá egy megszorítást, hogy az eladási ár ne lehessen alacsonyabb a várható ár 90%-ánál.
Tipp: az eladási ár nulla, amíg egy ajánlat nincs érvényesítve. Finomhangolnia kell az ellenőrzését, hogy ezt figyelembe vegye.
Figyelem
Mindig használja az float_compare() és float_is_zero() metódusokat az odoo.tools.float_utils-ból, amikor lebegőpontos számokkal dolgozik!
Biztosítsa, hogy a megszorítás minden alkalommal aktiválódjon, amikor az eladási ár vagy a várható ár megváltozik!
Az SQL megszorítások általában hatékonyabbak, mint a Python megszorítások. Amikor a teljesítmény számít, mindig részesítse előnyben az SQL-t a Python megszorításokkal szemben.
Our real estate module is starting to look good. We added some business logic, and now we make sure the data is consistent. However, the user interface is still a bit rough. Let’s see how we can improve it in the next chapter.