Работа с полями
Содержание
- Поля
- Типы полей
- Системные объекты
- Работа с реляционными полями
- Задания для самостоятельного повторения
Поля
В предыдущей статье, посвященной моделям, мы уже затронули поля. Основную информацию вы можете получить изучив документацию
Поле представляет собой Python класс, который при создании таблицы в базе данных определяет свойства указанного поля.
Например если мы посмотрим код из нашего демо модуля:
name = fields.Char(string='Name', help='Name of record')
field_one = fields.Integer(string='Field One', help='Value of Field One')
field_two = fields.Float(
string='Field Two',
help='Value of Field Two',
)
result_field = fields.Float(
string='Result',
help='Result of multiplying Field one and Field two',
compute='_compute_result_field',
)
Мы сможем увидеть что у нас здесь объявлены 4 поля. Обратите внимание что все они имеют какие-то атрибуты, какие именно вы можете узнать из документации. Здесь вы можете узнать общие атрибуты для всех полей. А так же у каждого тип поля могут быть свои индивидуальные атрибуты - вот тут можно быстро найти атрибуты которые относятся только для поля типа Char
, а так прочитать их описание.
Типы полей
Поля нужны для хранения данных различных типов. Система odoo предоставляет следующие типы полей для использования разработчиками:
- Базовые поля - классы полей, которые позволяют объявлять поля с базовыми типами данных:
- Bool (Булево значение)
- Char (Строка)
- Integer (Целое число)
- Float (Десятичная дробь)
- Расширенные поля - классы полей которые реализуют хранение сложных данных (Текст, картинка, время, файл). Поскольку поле - это класс, то у каждого класса могут быть вспомогательные методы, внимательно изучайте документацию
- Binary (Хранит двоичные данные, файл по простому)
- Html (Хранит html разметку)
- Image (Хранит изображения)
- Monetary (Хранит значение в денежных единицах)
- Selection (Хранит текстовую метку выбранного из заранее определенного списка значений)
- Text (Хранит произвольный текст)
- Date (Хранит дату в текстовом виде)
- Datetime (Хранит дату и время в текстовом виде)
- Реляционные поля - классы полей, которые реализуют хранение ссылки на другие модели(таблицы)
- Many2one (Хранит ID записи модели, на которую ссылается в атрибуте
comodel_name
) - One2many (Является рекордсетом из записей модели, на которую ссылается в атрибуте
comodel_name
) - Many2many (Является рекордсетом из записей модели, на которую ссылается в атрибуте
comodel_name
)
- Many2one (Хранит ID записи модели, на которую ссылается в атрибуте
- Псевдо-реляционные поля
- Reference (Хранит строку которая является ссылкой на запись произвольной модели
res_model.res_id
) - Many2oneReference (Хранит ID записи модели имя которой хранится в поле, которое указывается в атрибуте
model_field
, )
- Reference (Хранит строку которая является ссылкой на запись произвольной модели
- Вычисляемые поля - таким полем может быть поле любого типа, особенности лишь в том что в обычных условиях значения полей нужно предварительно задать при создании или изменении записи, а в случае вычисляемого поля значение при обращении к нему будет вычислено.
- Связанные поля - реализация жесткой ссылки на поле другой модели. Частный случай Вычисляемого поля
Системные объекты
-
Системные поля Эти поля будут создаваться или модифицироваться автоматически при создании или изменении записей
-
Зарезервированные имена полей Имена полей, поведение которых задано самой системой.
Работа с реляционными полями
У нас имеется три вида реляционных полей:
- Many2one
- One2many
- Many2many
Если с пониманием что делать с полем типа Many2one
у новичков проблем не возникает, то при использовании двух других типов One2many
и Many2many
могут возникать вопросы.
Про присвоение значений полям я уже писал в предыдущей статье, но там все действия проводились над полями с простым типом. А что если нам надо произвести какие-либо манипуляции на полями с типами One2many
и Many2many
? Для этого есть следующий набор команд:
Этот формат представляет собой список триплетов, выполняемых последовательно, где каждый триплет является командой, выполняемой по набору записей. Не все команды применяются во всех ситуациях. Возможные команды:
-
(0, 0, values) Создает новую запись, созданную из предоставленного values а затем добавляет в наше поле(values - это словарь где ключи это имена полей, а значения - собственно их значения).
-
(1,
id
, values) Обновляет существующую запись c идентификатором, указанным в переменнойid
, значениями из values. Нельзя задействовать при использовании ве методаcreate()
(нельзя использовать при создании новой записи). -
(2,
id
, 0) Удаляет запись с идентификатором, указанным в переменнойid
, из НЗ, а затем удаляет его (из базы данных тоже удаляет). Нельзя задействовать при использовании ве методаcreate()
. -
(3,
id
, 0) Удаляет запись c идентификатором, указанным в переменнойid
, из НЗ (не удаляет из базы данных). Нельзя задействовать при использовании ве методаcreate()
(нельзя использовать при создании новой записи). -
(4,
id
, 0) Добавляет существующую запись с идентификатором, указанным в переменнойid
, в НЗ. -
(5, 0, 0) Удаляет все записи из НЗ, что эквивалентно использованию команды 3 для каждой записи явно. Нельзя задействовать при использовании ве метода
create()
(нельзя использовать при создании новой записи). -
(6, 0,
ids
) Заменяет все существующие записи в НЗ списком ids, что эквивалентно использованию команды 5, за которой следует команда 4 для каждого id в ids.
Задания для самостоятельного повторения:
Глядя на данный фрагмент кода:
name = fields.Char(string='Name', help='Name of record')
field_one = fields.Integer(string='Field One', help='Value of Field One')
field_two = fields.Float(
string='Field Two',
help='Value of Field Two',
)
result_field = fields.Float(
string='Result',
help='Result of multiplying Field one and Field two',
compute='_compute_result_field',
)
Определите все типы полей, а так же ознакомьтесь со всеми используемыми атрибутами.
Обсуждение
Обсудить, указать на ошибки и опечатки можно здесь