Openerp _sql_约束在Odoo v10中不起作用

Openerp _sql_约束在Odoo v10中不起作用,openerp,odoo-9,odoo-10,Openerp,Odoo 9,Odoo 10,我有一个模型定义为- class ModelName(models.Model): _name = 'model_name' student_id = fields.Many2one('op.student', 'Student') 我希望那个学生应该是独一无二的。所以我补充说- _sql_constraints = [ ('student_unique', 'UNIQUE(student_id)', 'Some message!')

我有一个模型定义为-

class ModelName(models.Model):
    _name = 'model_name'
    student_id = fields.Many2one('op.student', 'Student')
我希望那个学生应该是独一无二的。所以我补充说-

    _sql_constraints = [
         ('student_unique',
         'UNIQUE(student_id)', 'Some message!')
    ]
但它什么也没做。我仍然可以选择相同的学生并保存表单

我想当我点击创建按钮时,已经保存记录的学生不应该显示出来


我能做些什么来实现这一点呢???

在你的领域里试试下面这个域函数,我相信你会得到你所需要的输出

student\u id=fields.many21'op.student',domain=lambda self:self.get\u not\u existing\u student\u id,string='student' @api.model def get_not_existent_student_idself: self.env.cr.executeselect id from op_student其中id不在select student_id from model_name datas=self.env.cr.fetchall 学生ID=[] 对于数据中的记录: 学生ID.appendrecord[0] 返回['id','in',学生id] 其他方式:

将其放在如下视图中:

<field name="student_id" context="{'find_existed':1}" options="{'no_create':1}"/>

我认为您需要先删除该模型中的所有记录。因为它只适用于模型中没有现有数据的情况。谢谢,现在开始工作。但在下拉列表中仍然可以看到同一个学生。有效的一点是,表单不是为同一个学生保存的。我希望学生在下拉列表中甚至不可见。请建议一种方法。您可以使用该字段学生id上的动态域仅显示任何记录中不存在的记录。您能简要介绍一下吗?它是否有效..?它只起作用一次。我去了表格,点击学生下拉列表,它显示了学生根据代码。我选择了一个学生并保存了表格。现在,当我再次创建另一个记录并尝试选择student时,同一个列表正在显示,但刷新后它再次工作。您是否在视图中的field student_id上使用了任何小部件?首先,如果postgreSQL引擎不工作,则会执行sql约束。这意味着您的数据有问题,阻止postgres创建约束。我认为@Viki Chavada answer是一个非常好的答案,但正如您所说的此域仅加载一次,因此,与其使用@api.model和域关键字use onchange event,不如在更改字段或再次加载from@api时始终调用onchange。onchange'student\u id'返回{'domain':{'student\u id':[相同的\u domain\u in\u answer]}是的,我总是忘记m2o称这种方法为lol nice thinking
<field name="student_id" context="{'find_existed':1}" options="{'no_create':1}"/>
class op_student(models.Model):
    _inherit ="op.student"

    @api.multi
    def name_get(self):
        if self._context.get("find_existed",False): 
            self.env.cr.execute("select id from op_student where id not in (select student_id from model_name)")
            datas = self.env.cr.fetchall()
            student_ids = []
            for record in datas:
                student_ids.append(record[0])
            for student in self:
                if student in student_ids:
                    res.append((student.id,student.name))
        else:
            res=super(op_student,self).name_get()
        return res