【问题标题】:_sql_constraints not working in Odoo v10_sql_constraints 在 Odoo v10 中不起作用
【发布时间】:2017-09-19 05:23:06
【问题描述】:

我有一个模型定义为-

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

我希望那个学生应该是独一无二的。所以我添加了-

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

但它什么也没做。我仍然可以选择同一个学生并保存表格。

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

我能做些什么来实现这个目标??

【问题讨论】:

  • 我认为您需要先从该模型中删除所有记录。因为它只适用于模型中没有现有数据的情况。
  • 谢谢,现在工作。但是该下拉列表中仍然可以看到同一个学生。起作用的是,表格不会为同一个学生保存。我希望学生甚至不应该在下拉列表中可见。请提出一种方法。
  • 您可以使用该字段 student_id 上的动态域来仅显示任何记录中都不存在的记录。
  • 你能介绍一下吗?
  • 有效吗..?

标签: openerp odoo-9 odoo-10


【解决方案1】:

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

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}"/>

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

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

【讨论】:

  • 它只工作一次。我转到表格并单击学生下拉菜单,它根据代码显示学生。我选择了一个学生并保存了表格。现在,当我再次创建另一条记录并尝试选择学生时,会显示相同的列表,但刷新后它又可以工作了。
  • 您是否在视图中的字段 student_id 上使用了任何小部件?
  • 第一个 _sql_constraints 由 postgreSQL 引擎执行,如果没有工作这意味着你的数据有问题,阻止 postgres 创建约束我认为@Viki Chavada 的答案是非常好的答案,但正如你所说的这个域仅加载一次,因此不要使用 @api.model 和域关键字使用 onchange 事件,最好在更改字段或再次加载 from 时始终调用 onchange @api.onchange('student_id')
  • return {'domain' : {'student_id': [same_domain_in_answer]}}
  • 是的,我总是忘记 m2o 调用这个方法大声笑很好的想法
猜你喜欢
  • 2015-10-22
  • 1970-01-01
  • 2021-02-14
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多