Работа с полями

Содержание

Поля

В предыдущей статье, посвященной моделям, мы уже затронули поля. Основную информацию вы можете получить изучив документацию

Поле представляет собой 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)
  • Псевдо-реляционные поля
    • Reference (Хранит строку которая является ссылкой на запись произвольной модели res_model.res_id)
    • Many2oneReference (Хранит ID записи модели имя которой хранится в поле, которое указывается в атрибуте model_field, )
  • Вычисляемые поля - таким полем может быть поле любого типа, особенности лишь в том что в обычных условиях значения полей нужно предварительно задать при создании или изменении записи, а в случае вычисляемого поля значение при обращении к нему будет вычислено.
  • Связанные поля - реализация жесткой ссылки на поле другой модели. Частный случай Вычисляемого поля

Системные объекты

Работа с реляционными полями

У нас имеется три вида реляционных полей:

  • 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',
    )

Определите все типы полей, а так же ознакомьтесь со всеми используемыми атрибутами.

Обсуждение

Обсудить, указать на ошибки и опечатки можно здесь