使用模型的字段作为标识符

时间:2014-06-19 19:02:44

标签: orm openerp-7

我在OpenERP 7中有以下模型。如何指示isbn字段应为主键

from osv import osv, fields

class Book(osv.Model):
  """ A book """
  _name = 'helloworld.book'
  _columns = {
    'isbn' : fields.char('ISBN', size=9, requried=True),
    'title' : fields.char('Title', size=100, required=True),
    'genre' : fields.char('Genre', size=20, required=True),
  }

1 个答案:

答案 0 :(得分:0)

主键是指定用于唯一标识所有表记录的特殊关系数据库表列(或列组合)。

主键的主要功能是:

  • 每行数据必须包含唯一值。

  • 它不能包含空值。

主键是现有的表列,或者是由数据库根据定义的顺序专门生成的列。

OpenERP通过在字段上保持唯一的sql约束来支持它。

_sql_constraints = [
('my_key_value', 'unique(key_value1,key_value2)', 'key value has to be unique !')
] 

在你的情况下,你选择了Char类型的Field,像这样设置sql约束。将它添加到你的类中。并重新启动服务器并再次检查。您会在' isbn'上找到主要密钥的功能。字段

    _sql_constraints = [
    ('isbn_uniq', 'unique(isbn)', 'ISBN must be unique!'),
]

对于不区分大小写的约束,

def _check_unique_insesitive(self, cr, uid, ids, context=None):
sr_ids = self.search(cr, uid ,[], context=context)
lst = [x.ibsn.lower() for x in self.browse(cr, uid, sr_ids, context=context) if x.ibsn]
for self_obj in self.browse(cr, uid, ids, context=context):
    if self_obj.ibsn and self_obj.ibsn.lower() in  lst:
        return False
return True

_constraints = [(_check_unique_insesitive, 'Error: ISBN must be unique!', ['ibsn'])]

希望这会对你有所帮助。 :)