Model - pola rekordów
Zobacz też: http://odoo-new-api-guide-line.readthedocs.io/en/latest/fields.html
Przykład modelu (nowy_model) z nowym polem 'name':
from odoo import models, fields
class AModel(models.Model):
_name = 'nowy_model'
name = fields.Char(
string="Name", # Optional label of the field
compute="_compute_name_custom", # Transform the fields in computed fields
store=True, # If computed it will store the result
select=True, # Force index on field
readonly=True, # Field will be readonly in views
inverse="_write_name" # On update trigger
required=True, # Mandatory field
translate=True, # Translation enable
help='blabla', # Help tooltip text
company_dependent=True, # Transform columns to ir.property
search='_search_function' # Custom search function mainly used with compute
)
# The string key is not mandatory
# by default it wil use the property name Capitalized
Zwróć uwagę na to, że nazwa atrybutu/pola obiektu (powyżej "name") równa się nazwie pola w bazie danych! Nie musi to być jawnie deklarowane.
Typy pól
W poniższych opisach pominięto parametry występujące we wszystkich typach pól, a opisano tylko specyficzne dla nich parametry. Do tych pierwszych należą:
- string - opcjonalny opis (wyświetlany w formatkach)
- compute - funkcja wyliczająca wartość (pola "wirtualne" / wyliczeniowe / computed)
- store - czy wartość wyliczana (compute) jest zapamiętywana w bazie
- select - pole aktualne (wybór startu w edycji)
- readonly - nie może być zmieniane
- inverse - trigger wywoływany po zmianie
- required - wymagane
- help - podpowiedź
- company_dependent - wykorzystanie w wielofirmowości (ir.property)
- search - funkcja wyszukiwania dla pól wyliczeniowych
- default - wartość domyślna (lub funkcja wyliczająca tą wartość)
Boolean
abool = fields.Boolean()
Wartość logiczna (prawda / fałsz)
Char
achar = fields.Char()
Właściwości specyficzne dla tego typu pól:
- size: dane będą obcinane do tej wielkości
- translate: zawartość pola może być tłumaczone (w wersjach wielojęzycznych - w interfejsie pojawia się ikonka globusa która otwiera tłumaczenia).
Text
atext = fields.Text()
Używane do bardzo długich tekstów.
HTML
Tak jak Text - ale dla tekstów o strukturze HTML (w interfejsie pojawia się edytor JS)
anhtml = fields.Html()
Właściwości specyficzne dla tego typu pól:
- translate: zawartość pola może być tłumaczone (w wersjach wielojęzycznych - w interfejsie pojawia się ikonka globusa która otwiera tłumaczenia).
Integer
Liczby całkowite. Nie uwzględnia wartości null (None). Gdy wartość nie ustawiona - zwracane jest 0
anint = fields.Integer()
Float
Liczby rzeczywiste. Nie uwzględnia wartości null (None). Gdy wartość nie ustawiona - zwracane jest 0.0.
afloat = fields.Float()
afloat = fields.Float(digits=(32, 32))
afloat = fields.Float(digits=lambda cr: (32, 32))
Właściwości specyficzne dla tego typu pól:
- digits: powoduje użycie w bazie danych typu numeric. Można podać krotkę (int len, float len) lub funkcję zwracającą taką krotkę (z parametrem w postaci kursora)
Date
Data. Dostępne są pomocnicze funkcje ('Helpers'):
today
returns zwraca dzisiejszą datęcontext_today
zwraca dzisiejszą datę z uwzględnieniem systemowej strefy czasowej (tz)from_string
- zamienia napis (łańcuch znaków) na datę z wykorzystaniem datetime.date()to_string
zwraca napis reprezentujący datę (z datetime.date)
Przykłady (z konsoli):
In [1]: import datetime
In [2]: from odoo import fields
In [3]: fields.Date.today()
Out[3]: '2017-12-31'
In [4]: fields.Date.context_today(self)
Out[4]: '2017-12-31'
In [5]: fields.Date.context_today(self, timestamp=datetime.datetime.now())
Out[5]: '2017-12-31'
In [6]: fields.Date.from_string(fields.Date.today())
Out[6]: datetime.date(2017, 12, 31)
In [7]: fields.Date.to_string(datetime.datetime.today())
Out[7]: '2017-12-31'
DateTime
Data i czas. Dostępne są pomocnicze funkcje ('Helpers'):
context_timestamp
zwraca stempel czasu (teraz) z uwzględnieniem systemowej strefy czasowej (tz)now
czas systemowyfrom_string
zamiana napisu na czasto_string
zamienia czas na napis
Przykłady z konsoli:
In [1]: import datetime
In [2]: from odoo import fields
In [3]: fields.Datetime.context_timestamp(self, timestamp=datetime.datetime.now())
Out[3]: datetime.datetime(2017, 12, 31, 2, 3, 12, 597419, tzinfo=<UTC>)
In [4]: fields.Datetime.now()
Out[4]: '2017-12-31 02:03:26'
In [5]: fields.Datetime.from_string(fields.Datetime.now())
Out[5]: datetime.datetime(2017, 12, 31, 2, 3, 39)
In [6]: fields.Datetime.to_string(datetime.datetime.now())
Out[6]: '2017-12-31 02:03:49'
Binary
Dane zakodowane algorytmem base64:
abin = fields.Binary()
Selection
Zapamiętuje tekst ustalany na podstawie widżetu (kontrolki) wyboru. Nie powoduje ustawienia ograniczenia wyboru w bazie danych. Wybór definiowany w postaci listy krotek lub funkcji zwracającej listę krotek:
aselection = fields.Selection([('a', 'A')])
aselection = fields.Selection(selection=[('a', 'A')])
aselection = fields.Selection(selection='a_function_name')
Właściwości specyficzne dla tego typu pól:
selection
: lista krotek opisujących wybierane wartościsize
: rozmiar (size=1) obowiązkowe gdy wybieramy wartości ponumerowane (integer)selection_add
dodaje wartości wyboru w modelach dziedzicznych - zob. przykład:
class NowyModel(models.Model):
_inherit = 'model.z.polem.wybor'
wybor = fields.Selection(selection_add=[('5', 'pięć'), ('6', 'sześć')])
Reference
Powiązana z innym modelem/polem:
aref = fields.Reference([('model_name', 'String')])
aref = fields.Reference(selection=[('model_name', 'String')])
aref = fields.Reference(selection='a_function_name')
Właściwości specyficzne dla tego typu pól:
selection
: lista krotek opisujących wybierane wartości
Many2one, One2many, Many2many
Pola wyboru / powiązań z innymi modelami. Szczegółowo opisano je w rozdziale "Powiązania".
Właściwości specyficzne dla tego typu pól:
comodel_name
: nazwa modelu powiązanegodelegate
: pole przenoszone mechanizmem delegowania dziedziczenia w Many2One (zob. rysunek objaśniający: https://www.odoo.com/documentation/9.0/howtos/backend.html#model-inheritance)inverse_name
: nazwa pola z modelu powiązanego w One2manyrelation
: nazwa relacji / tabeli do zapamiętania powiązań w Many2manycolumns1, columns2
: nazwy kolumn (lewa i prawa) powiązanych w Many2many
Przykłady:
arel_id = fields.Many2one('res.users')
arel_id = fields.Many2one(comodel_name='res.users')
an_other_rel_id = fields.Many2one(comodel_name='res.partner', delegate=True)
arel_ids = fields.One2many('res.users', 'rel_id')
arel_ids = fields.One2many(comodel_name='res.users', inverse_name='rel_id')
arel_ids = fields.Many2many('res.users')
arel_ids = fields.Many2many(comodel_name='res.users',
relation='table_name',
column1='col_name',
column2='other_col_name')
Dla pola many2many istnieje szereg fajnych kontrolek (widget) które pozwalają na wygodne operowanie powiązanymi danymi. Najczęściej używa się many2many_tags (http://ludwiktrammer.github.io/odoo/form-widgets-many2many-fields-options-odoo.html).