Как сделать поле в OpenERP необходимым только для определенного состояния рабочего процесса?

В моей установке OpenERP у меня есть следующее поле, которое раньше не требовалось, но я изменил требуемый аргумент на True.

'fiscal_position': fields.many2one(
    'account.fiscal.position',
    'Fiscal Position',
    required=True,
    readonly=True,
    states={'draft':[('readonly',False)]}
    ),

В журнале отладки я вижу, что ORM пытается установить ненулевое ограничение для этого поля в базе данных.

2013-01-04 15:28:56 EET STATEMENT:  ALTER TABLE "account_invoice"
    ALTER COLUMN "fiscal_position" SET NOT NULL

Как я могу это предотвратить? Моя идея - иметь требуемый флаг True, только для новых записей и без ограничения NOT NULL. В других случаях возникают ошибки целостности PostgreSQL:

IntegrityError: null value in column "fiscal_position" violates
    not-null constraint

Итак, как я могу получить требуемое поле в представлении формы, не заставляя ORM касаться ограничений схемы базы данных? Или как я могу изменить поле, которое требуется динамически, в соответствии с состоянием объекта?

Ответ 1

Чтобы сделать поле требуемым только в некоторых состояниях, оставьте его как не обязательным в модели, и в форме формы установите условия, в которых потребуется поле:

<field
    name="fiscal_position"
    attrs="{'required':[('state','in',['pending','open'])]}"
    />

Ответ 2

Если вы пишете файл required=True в .py, тогда ORM добавит в это поле не нулевой ограничитель.

Существует несколько способов сделать код.

  • Сделайте required=True в .py файле и задайте значение по умолчанию для этого поля.
  • Сделайте required=False и установите required=True в view.xml.
  • Сделайте required=False и установите required=True в view.xml для некоторого состояния объекта.

Это может помочь решить вашу проблему.