14

OpenERP / PostgreSQLに次の列を持つテーブルがあります:namedescription

一意の名前に対して次の検証を追加しました。

_sql_constraints = [('unique_name', 'unique(name)', 'A record with the same name already exists.')]

正常に動作しますが、大文字と小文字が区別されます。現在、「Mickey」、「MICKEY」、「mickey」などの値を受け入れます。

Wrong Way:
--------------------------
| name   | description   |
--------------------------
| mickey | not a mouse   |
--------------------------
| MICKEY | not a mouse   |
--------------------------
| Mickey | not a mouse   |
--------------------------

ユーザーが「Mickey」、「MICKEY」、「mickey」などの複数の値を追加できないように検証コードを修正する方法はありますか?一意キー検証の大文字と小文字を区別しないようにするにはどうすればよいですか?

Right Way:
--------------------------------
| name         | description   |
--------------------------------
| mickey       | not a mouse   |
--------------------------------
| mickey mouse | is a mouse    |
--------------------------------
| donald       | is a duck     |
--------------------------------
4

3 に答える 3

16

こちらcase insensitive constraintsをチェックしてください。SQLの代わりにOpenerpConstraints をいつでも使用できます。

openerp制約の場合

例を確認してください

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

_constraints = [(_check_unique_insesitive, 'Error: UNIQUE MSG', ['FIELD'])]
于 2012-11-07T05:25:51.777 に答える
1

この方法では、データベースからすべてのデータを読み取る必要はありません。

def _check_unique_insesitive(self, cr, uid, ids, context=None):

    for self_obj in self.browse(cr, uid, ids, context=context):
        if self_obj.name and self.search_count(cr, uid, [('name', '=ilike', self_obj.name), ('id', '!=', self_obj.id)], context=context) != 0:
            return False

    return True

_constraints = [(_check_unique_insesitive, _('The name must be unique!'), ['name'])]
于 2018-04-26T15:33:41.960 に答える
-1

より簡単な方法でOdoo8.0以降の制約を使用します。モデルのすべてのレコードを取得し、lower()を使用して、自己レコードを除外して、目的のフィールド値を確認します。

@api.constrains('code')
def _check_duplicate_code(self):
    codes = self.search([])
        for c in codes:
            if self.code.lower() == c.code.lower() and self.id != c.id:
                raise exceptions.ValidationError("Error: code must be unique")
于 2018-02-22T22:59:43.453 に答える