Использовать поле модели в качестве идентификатора

#orm #openerp-7

#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:

Первичный ключ — это специальный столбец таблицы реляционной базы данных (или комбинация столбцов), предназначенный для уникальной идентификации всех записей таблицы.

Основными функциями первичного ключа являются:

  • Оно должно содержать уникальное значение для каждой строки данных.

  • Оно не может содержать нулевые значения.

Первичный ключ — это либо существующий столбец таблицы, либо столбец, который специально генерируется базой данных в соответствии с определенной последовательностью.

OpenERP поддерживает это, сохраняя уникальное ограничение sql для поля.

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

В вашем случае, поскольку вы выбрали тип поля Char, установите ограничение 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'])]
  

Надеюсь, это вам поможет. 🙂

Комментарии:

1. Я уже пробовал это, но это не работает : _sql_constraints = [ ('unique_isbn', 'unique(isbn)', 'The ISBN must be unique'), ('unique_title', 'unique(title)', 'The title must be unique') ]

2. Для нечувствительности к регистру вы должны установить ограничение. проверьте мой обновленный ответ.