Проблемы с перезаписью поля модели в Python в Odoo?

Я создал модуль, который изменяет другой (названный base). В модуле base есть модель res.partner, а в этой модели есть поле birthdate:

_columns = {
...
    'birthdate': fields.char('Birthdate'),
...
}

Что я делаю в своем модуле, так это перезаписываю это поле, чтобы оно было типа Date:

birthdate = fields.Date('Birthdate')

Кажется, все в порядке, но после обновления сервера Odoo данные, представленные в этом столбце, исчезают из представления, и когда я проверяю базу данных, я обнаруживаю, что столбец birthdate дублируется с другими именами, такими как birthdate_moved0, birthdate_moved1, birthdate_moved2 и т. Д. ... (причем половина из них имеет тип char, а другая половина - тип date). Значения, хранящиеся в birthdate, перемещаются в эти другие столбцы (это причина, по которой я не вижу данные в представлении, поскольку в форме отображается только birthdate).

Однако мне удалось перезаписать несколько полей через Python. Но эта проблема дублирования случилась у меня с полем birthdate и полем function модели res.partner.

Я не могу прийти к выводу. Кто-нибудь может мне здесь помочь, пожалуйста? Заранее спасибо!


person forvas    schedule 19.05.2015    source источник


Ответы (2)


Вы должны назвать свое «новое» поле «Birth_date» или «dob» или как-нибудь иначе, кроме «birthday», чтобы избежать изменения существующего типа данных поля. На следующем шаге вы можете скопировать значения из текущего поля «день рождения» в новое (через postgresql).

person gordian1983    schedule 19.05.2015
comment
Большое спасибо @ gordian1983! Фактически, это именно то, что я сделал, чтобы избежать проблемы. Но мой вопрос в том, почему некоторые поля вызывают проблемы при их перезаписи, а другие - нет? Можно ли перезаписать поле через Python или это плохая идея? - person forvas; 19.05.2015

Наконец, коллега показал мне решение:

Дело не в Odoo, а в PostgreSQL. Как правило, в PostgreSQL невозможно изменить тип данных столбца (даже если он пуст), за исключением некоторых случаев, например:

  • От integer до char: поскольку преобразование в char возможно. Следовательно, в Odoo, когда вы меняете тип данных field.Date, field.Integer, field.Many2one и т. Д. На fields.Char, проблем нет. Однако, если вы попытаетесь изменить field.Char на fields.Date или fields.Many2one, или что-то еще, PostgreSQL скопирует столбец, потому что он не готов для такого типа приведения.

Это причина, потому что я не смог изменить поле типа Char и преобразовать его в поле типа Date (моя попытка с датой рождения) или Many2one (моя попытка с функцией ). А с другой стороны, мне удалось перезаписать поле Selection (на самом деле в PostgreSQL есть преобразование Char в другой Char).

Итак, в заключение: если вы собираетесь изменить тип данных поля, проверьте, является ли последний тип данных char (fields.Char, fields.Selection и т. Д.) Или другим возможным преобразованием. Затем вы можете назвать новое поле тем же именем, что и раньше. Если нет, вы должны назвать новое поле другим именем, иначе PostgreSQL скопирует столбец с name_moved0, name_moved1 и т. Д.

Надеюсь, это кому-нибудь поможет !!

person forvas    schedule 28.05.2015