from odoo import fields, models from odoo.exceptions import ValidationError """ odoo会自动为模型添加一些特殊字段: - id: 主键,自动生成 - create_uid: 创建者的用户ID - create_date: 创建时间 - write_uid: 最后修改者的用户ID - write_date: 最后修改时间 - display_name: 显示名称,通常是name字段的值 - __last_update:一个计算字段 ,不在数据库中存储,用于做并发检测 """ class Book(models.Model): # UID,仅模型名用点号.分隔关键词 _name = 'library.book' # 模型记录显示名 _description = 'Book' # 以下声明模型字段 # name和active均为特殊字段名。默认对Odoo有特殊用途。 # name默认用作记录显示名,在另一个模型引用它时显示。active字段用于在用户界面中过滤掉无效记录。 name = fields.Char('Title', required=True) isbn = fields.Char('ISBN') active = fields.Boolean('Active?', default=True) date_published = fields.Date() image = fields.Binary('Cover') # Many2one表示一对多关系,Many2many表示多对多关系 publisher_id = fields.Many2one('res.partner', string='Publisher') author_ids = fields.Many2many('res.partner', string='Authors') def button_check_isbn(self): """检查ISBN的有效性""" # 遍历当前记录集中的每一条记录 for book in self: if not book.isbn: raise ValidationError('Please provide an ISBN for %s' % book.name) if book.isbn and not book._check_isbn(): raise ValidationError('%s is an invalid ISBN' % book.isbn) return True def _check_isbn(self): """检查ISBN是否有效""" # 确保当前记录集只有一条记录 self.ensure_one() isbn = self.isbn.replace('-', '') # 为保持兼容性自行添加 digits = [int(x) for x in isbn if x.isdigit()] if len(digits) == 13: ponderations = [1, 3] * 6 terms = [a * b for a,b in zip(digits[:12], ponderations)] remain = sum(terms) % 10 check = 10 - remain if remain !=0 else 0 return digits[-1] == check