OpenERP и related поля
В официальной документации очень мало написано про то, как использовать поля типа related.
Прототип в официальной документации и его описание:
Sometimes you need to refer to the relation of a relation. For example, supposing you have objects: City -> State -> Country, and you need to refer to the Country from a City, you can define a field as below in the City object:
Where:
— The first set of parameters are the chain of reference fields to follow, with the desired field at the end.
— type is the type of that desired field.
— Use relation if the desired field is still some kind of reference. relation is the table to look up that reference in.
Но как показывает практика этого описания недостаточно.
Есть, например, два класса invoce и contract.
Нам необходимо, что бы пи создании новой записи в invoice происходила запись полей date_invoice и name_invoice в поля date_contract и name_contract объекта contract.
Для этого описываем дополнительные поля в классе invoice:
Теперь автоматически при создании invoice будет делаться запись в contract.
Вообще, лучше описать прототип так:
Аргумент store служит для сохранения значений в базе:
Если True — данные сохраняются в базе данных
Если False — то это просто поле-функция, без сохранения данных в БД
Прототип в официальной документации и его описание:
Sometimes you need to refer to the relation of a relation. For example, supposing you have objects: City -> State -> Country, and you need to refer to the Country from a City, you can define a field as below in the City object:
'country_id': fields.related(
'state_id',
'country_id',
type="many2one",
relation="res.country",
string="Country",
store=False)
Where:
— The first set of parameters are the chain of reference fields to follow, with the desired field at the end.
— type is the type of that desired field.
— Use relation if the desired field is still some kind of reference. relation is the table to look up that reference in.
Но как показывает практика этого описания недостаточно.
Есть, например, два класса invoce и contract.
class invoice(osv.osv):
_name = "invoice"
_columns = {
'name_invoice': fields.char('Name'),
'date_invoice': fields.datetime('Date')
#'invoice_line': fields.one2many(....)
#..... Список других полей .....
}
class contract(osv.osv):
_name = "contract"
_columns = {
'name_contract': fields.char('Name'),
'date_contract': fields.datetime('Date')
#..... Список других полей .....
}
Нам необходимо, что бы пи создании новой записи в invoice происходила запись полей date_invoice и name_invoice в поля date_contract и name_contract объекта contract.
Для этого описываем дополнительные поля в классе invoice:
'name_lnk': fields.related('name_invoice', 'name_contract', type="char", relation="contract", string="Name")
'date_lnk': fields.related('date_invoice', 'date_contract', type="datetime", relation="contract", string="Date")
Теперь автоматически при создании invoice будет делаться запись в contract.
Вообще, лучше описать прототип так:
'country_id': fields.related(
<поле_источника>,
<поле_приёмника>,
type=<тип_поля>,
relation=<модель_приёмника>,
string=<строковое_описание>,
store=False)
Аргумент store служит для сохранения значений в базе:
Если True — данные сохраняются в базе данных
Если False — то это просто поле-функция, без сохранения данных в БД