Как сделать поле в 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 затрагивать ограничения схемы базы данных? Или как я могу динамически изменить требуемое поле в зависимости от состояния объекта?


person Jordan Jambazov    schedule 04.01.2013    source источник


Ответы (2)


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

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

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

Есть несколько способов сделать ваш код.

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

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

person Nilesh    schedule 05.01.2013
comment
Спасибо. Попробую и это. - person Jordan Jambazov; 05.01.2013