2017-09-19 74 views
2

不工作我有一个模型中定义的原样_sql_constraints在Odoo V10

class ModelName(models.Model): 
    _name = 'model_name' 
    student_id = fields.Many2one('op.student', 'Student') 

我想要的学生应该是唯一的。所以我补充说 -

_sql_constraints = [ 
     ('student_unique', 
     'UNIQUE(student_id)', 'Some message!') 
    ] 

但它没有做任何事。我仍然可以选择同一个学生并保存表格。

我希望当我点击create按钮时,不应显示已保存记录的学生。

我该怎么做才能做到这一点?

+1

我认为您需要先删除该模型中的所有记录。 ,因为它只适用于模型中没有现有数据的情况。 –

+2

谢谢,现在工作。但是同样的学生在该下拉列表中仍然可见。正在工作的事情是,形式不是为同一个学生储蓄。我希望学生不应该在下拉列表中显示。请建议一种方法。 –

+0

您可以使用该字段student_id上的动态域来仅显示任何记录中不存在的记录。 –

回答

4

在你的领域尝试下面的域功能,我相信你会得到你需要的输出。

student_id = fields.Many2one('op.student',domain=lambda self: self.get_not_existing_student_id(), string='Student') 

@api.model 
def get_not_existing_student_id(self): 
    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]) 
    return [('id','in',student_ids)] 

另一种方式:

student_id = fields.Many2one('op.student',string='Student') 

把它放在一个视图,如:

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

然后继承方法name_get()在这样op.student模型。

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 
+0

它只能使用一次。我去了表单并点击了学生下拉菜单,它根据代码显示了学生。我选择了一名学生并保存了表格。现在,当我再次创建另一条记录并尝试选择学生时,同样的列表正在显示,但在刷新之后它再次正常工作。 –

+0

您是否在视野中的字段student_id上使用过任何小部件? –

+1

首先_sql_constraints是由postgreSQL引擎执行,如果没有工作,这意味着你的数据有问题,防止postgres创建约束 我觉得@Viki Chavada答案是非常好的答案,但正如你所说这个域只加载一次所以不是使用@ api.model和domain关键字使用onchange事件,而是更好的onchange总是在字段被改变时或当from再次被加载时被调用。@ @ api.onchange('student_id')' – Cherif

相关问题