2017-07-21 4 views
3

私はしばらくこの戦いをしています。 2つの選択肢のどれもがエラーを出すことも、働いていることもありません。私はあなたが見るためにpythonの拘束方法をコメントしました。sqlとpythonの両方の制約がodooで機能していません9

コードスニペット:

class house_development(models.Model): 
    _name = 'house.development' 
    _description = 'Development' 
    _inherit = ["mail.thread"] 

    name = fields.Char(string="Name", required=True, track_visibility='onchange') 
    description = fields.Text(string="Description", track_visibility='onchange') 

    # @api.one 
    # @api.constrains('name') 
    # def _identify_same_name(self): 
    #  for record in self: 
    #   if record.name in self: 
    #    raise exceptions.ValidationError("There is another development/project with the same name: %s" % record.name) 

    _sql_constraints = [ 
     ('name_unique', 
     'UNIQUE(name)', 
     "There is another development/project with the same name"), 
    ] 

答えて

2

それはそのようにする必要があり、あなたが同じ名前のためではなく、同じIDで検索する必要が

@api.multi 
@api.constrains('name') 
def _identify_same_name(self): 
    for record in self: 
     obj = self.search([('name','=ilike',record.name),('id','!=',record.id)]) 
     if obj: 
      raise exceptions.ValidationError("There is another development/project with the same name: %s" % record.name) 

データベース固有の制約については、そのように追加することができます。 テーブル内の重複する名前がある場合

_sql_constraints = [ 
    ('name_unique', 'unique(name)', 'There is another development/project with the same name!!!'), 
] 

データベースの制約が追加されることはありません。 SQL制約は、既存のデータ によってルールが違反されていない場合にのみ適用されます。あなたのケースでは、それはSql 制約のポイントだと思います。モジュールをアップグレードする必要があることを確認してください。最初に そのクエリを実行してデータベース内の重複レコードをチェックします。 odoo Click to see moreで、ドメイン内の

Select name, count(*) from table_name 
group by name 
having count(*) > 1; 

使用可能な演算子。

+0

Emipro Techに感謝しますが、私は 'house'と 'House'を入力すると、制約をバイパスして保存されることに気付きました。この大文字と小文字の区別をコードに含めるにはどうすればよいですか?次に、なぜ@ api.oneの代わりに@ api.multiを使用しましたか? – John

+0

ドメインの演算子を更新しました。確認してください。 –

+0

ありがとう本当に良い男.....なぜあなたは@ api.oneの代わりに@ api.multiを使用しましたか? – John

関連する問題