Пожалуйста, исправьте меня в следующем коде в Odoo

Это следующий код в Odoo, и он работает не так, как я ожидал.

 def _check_dates(self, cr, uid, ids, context=None):    
    for rec in self.browse(cr, uid, ids, context=context):
        if rec.rdate and rec.gdate :
        start = date.strftime(str(rec.rdate), "%Y-%m-%d")
        end = date.strftime(str(rec.gdate), "%Y-%m-%d")
        if start >= end:
                return False
    return True

    _constraints = [
        (_check_dates, 'Error ! Received Date must be less or equal than given Date', ['rdate'])
        ]

Пожалуйста, поправьте меня кто-нибудь. Спасибо


person Shravy    schedule 01.09.2015    source источник
comment
Какая необходимость конвертировать даты в strftime? как позже вы сравниваете две даты?   -  person Emipro Technologies Pvt. Ltd.    schedule 01.09.2015
comment
да, это на самом деле сравнение дат. как правильно сравнивать даты? Я хотел ограничить и показать сообщение проверки   -  person Shravy    schedule 01.09.2015
comment
Вы пробовали сравнивать напрямую, как если бы rec.rdate › rec.gdate ? Если хотите попробовать, посмотрите примеры time.strptime   -  person Emipro Technologies Pvt. Ltd.    schedule 01.09.2015


Ответы (1)


Использование нового ORM API Odoo 8 (не нужно ничего добавлять в список _constraints, который теперь устарел):

@api.one
@api.constrains('rdate', 'gdate')
def _check_dates(self):
    if self.rdate and self.gdate:
        start = fields.Date.from_string(self.rdate)
        end = fields.Date.from_string(self.gdate)
        if start > end:
            raise exceptions.ValidationError("Error! Received Date must be less or equal than given Date")

Примечание. Я изменил start >= end на start > end, чтобы оно соответствовало вашему сообщению об ошибке (поскольку предыдущий код не принимал равные даты).


В качестве альтернативы вы можете настроить его как ограничение SQL, преимущество которого заключается в работе на более глубоком уровне базы данных:

_sql_constraints = [
    (
        'rdate_gdate_check',
        'check(rdate <= gdate)',
        "Error! Received Date must be less or equal than given Date",
    ),
]
person Ludwik Trammer    schedule 01.09.2015
comment
Да, большое спасибо, Людвик. - person Shravy; 01.09.2015
comment
Людвик Траммер, пожалуйста, не могли бы вы помочь мне в этом вопросе? stackoverflow.com/ вопросы/32368499/ - person Shravy; 04.09.2015