Верхнее поле ограничения Odoo 10

Я хочу увеличить поле, прежде чем вставлять запись в базу данных в Odoo 10.

Я попробовал это и хорошо работает:

@api.one
@api.constrains('field')
    def to_upper(self):
        if self.field == "x":
            self.field = self.field.upper()

Но если я добавлю еще как

@api.one
@api.constrains('field')
    def to_upper(self):
        if self.field == "x":
            self.field = self.field.upper()
        else:
            raise ValidationError("Error")

Всегда возвращайте else ValidationError (пока если оператор if верен, потому что без else работает хорошо)

Кто-нибудь может мне помочь? Спасибо.


person Yeray    schedule 17.05.2017    source источник


Ответы (2)


ограничение не должно использоваться для управления значением.

Каждый раз, когда вы пытаетесь установить значение «поля», оно само вызывает ограничение, и это приводит к «РЕКУРСИИ»!

здесь вы всегда получаете повышение ValidationError("Error") из-за рекурсии.

==> здесь то, что происходит сначала, когда вы конвертируете значение «поля» из «x» в «X» и снова устанавливаете его в поле, делая это, снова вызывает ограничение со значением «X», и ваше условие становится ложным и вызывает ошибку.

поместите оператор печати в if & else и проверьте консоль, вы получите лучшее представление!

person DexJ    schedule 18.05.2017
comment
Спасибо за ваш ответ! Можете ли вы дать мне пример того, как это войти? Я новичок в odoo и python :( Спасибо!! Или идея о том, как я могу манипулировать данными перед вставкой? - person Yeray; 18.05.2017
comment
вы запускаете среду разработки, а затем на локальном сервере, тогда вы можете проверить с помощью простого оператора Python Print, который будет напечатан вместе с журналами на терминале / консоли, где вы запустили сервер odoo. И для управления значением вы можете использовать методы on_change или create/write (ознакомьтесь с документацией› odoo.com/documentation/10.0/reference/orm.html) - person DexJ; 18.05.2017
comment
Спасибо! Просто добавил методы создания/записи и работает хорошо. Но у меня проблема. При записи, если я редактирую значение одного поля, требуется изменить значения всех полей, которые я объявил при переопределении записи. Любой способ исправить это? - person Yeray; 18.05.2017
comment
Хорошо, я исправляю это, проверяя, существует ли ключ в значениях в def write(self, values). Спасибо за ваше время. - person Yeray; 18.05.2017

Проверьте, поможет ли это вам

    @api.constrains('name')
    def _check_name(self):     
        if self.name:
            final_name=''
            for letters in self.name:
                if re.match(r'[a-zA-Z0-9\- .]',letters):
                    final_name += letters
                else:
                    not_accept_letters = letters
                    raise ValidationError(_('The character that you entered has not accepted %s')% not_accept_letters) 
            if self.name.islower():
                self.name = final_name.upper()
person Kiran Babu    schedule 27.04.2018
comment
Пожалуйста, объясните свои строки кода, чтобы другие пользователи могли понять его функциональность. Спасибо! - person Ignacio Ara; 27.04.2018