为 One2many 字段设置默认值
Set default values for One2many field
我有一个 class student_student
,它有一个 one2many 字段result_ids
,定义如下:
result_ids = fields.One2many("schoolresults.detail", "student_id", "School Results", default="_get_subjects")
和
def _get_subjects(self):
cr = self.pool.cursor()
self.env
return self.pool.get('schoolresults.subject').search(cr, self.env.uid, [])
在另一边我有一个 class schoolresults_subject
:
class schoolresults_subject(models.Model):
_name = "schoolresults.subject"
_description = "Student's subjects."
name = fields.Char("Subject")
class schoolresults_detail(models.Model):
_name = "schoolresults.detail"
_description = "Student's results."
student_id = fields.Many2one("student.student", "Student", ondelete="cascade")
subject_id = fields.Many2one("schoolresults.subject", "Subject")
result = fields.Float("Result", compute='_compute_value', store=True)
我想做的是用上次 class 中的科目列表填充 result_ids,每当用户尝试创建新的学生资料时,使用 default
one2many 字段中的参数。
但是每当我尝试创建学生资料时,我都会收到此错误 Wrong values for student.student.result_ids
。
请问有没有办法实现这一目标?
PS。我正在使用 Odoo 9
我没有完全了解您的要求,但请尝试以下操作:
def _get_subjects(self):
subjects = self.env['schoolresults.subject'].search([])
details = self.env['schoolresults.detail']
for subject in subjects:
details |= details.new({'subject_id': subject.id})
return details
但解释错误消息:您正在返回 schoolresults.subject
的 RecordSet,但您的字段 result_ids
具有共同模型 schoolresults.detail
。那是错误的;-)
我可以通过覆盖 default_get
方法来做到这一点:
def default_get(self, fields):
res = super(student_student, self).default_get(fields)
srd = self.env['schoolresults.detail']
ids=[]
school_result={'subject_id':1,'result':0} #dict for fields and their values
sr = srd.create(school_result)
ids.append(sr.id)
res['result_ids'] = ids
return res
这是为 one2many 字段覆盖 default_get
的方法。
致谢:
result_ids = fields.Many2many("schoolresults.detail", "student_id", "School Results", default="_get_subjects")
def get_default_lines(self):
obj = self.env['your.class.name'].search([])
return obj
尝试将 many2many 字段添加到您的 class。
请阅读这篇文章如果你想从操作中设置one2many字段的默认值,你可以创建一个元组列表,其格式与我们用于创建或编写one2many的格式相同字段,然后您可以将其传递给上下文。
您可以复制您的上下文-
context = self.env.context.copy()
像这样准备 one2many 值--
pr_lines = []
for pr_line in pr_obj.line_ids: #loop for multiple lines.
pr_lines.append((0,0, {
'purchase_request_id' : pr_obj.id,
'product_id' : pr_line.product_id.id,
'description' : pr_line.name,
'qty_transfer' : pr_line.product_qty,
'uom_id' : pr_line.product_uom_id.id,
}))
您可以像这样更新您的上下文-
context.update({
'default_warehouse_id': self.approving_matrix_id.warehouse.id,
'default_internal_transfer_receipt': pr_lines,
})
在动作中你可以像这样传递上下文
'context':上下文,
我有一个 class student_student
,它有一个 one2many 字段result_ids
,定义如下:
result_ids = fields.One2many("schoolresults.detail", "student_id", "School Results", default="_get_subjects")
和
def _get_subjects(self):
cr = self.pool.cursor()
self.env
return self.pool.get('schoolresults.subject').search(cr, self.env.uid, [])
在另一边我有一个 class schoolresults_subject
:
class schoolresults_subject(models.Model):
_name = "schoolresults.subject"
_description = "Student's subjects."
name = fields.Char("Subject")
class schoolresults_detail(models.Model):
_name = "schoolresults.detail"
_description = "Student's results."
student_id = fields.Many2one("student.student", "Student", ondelete="cascade")
subject_id = fields.Many2one("schoolresults.subject", "Subject")
result = fields.Float("Result", compute='_compute_value', store=True)
我想做的是用上次 class 中的科目列表填充 result_ids,每当用户尝试创建新的学生资料时,使用 default
one2many 字段中的参数。
但是每当我尝试创建学生资料时,我都会收到此错误 Wrong values for student.student.result_ids
。
请问有没有办法实现这一目标?
PS。我正在使用 Odoo 9
我没有完全了解您的要求,但请尝试以下操作:
def _get_subjects(self):
subjects = self.env['schoolresults.subject'].search([])
details = self.env['schoolresults.detail']
for subject in subjects:
details |= details.new({'subject_id': subject.id})
return details
但解释错误消息:您正在返回 schoolresults.subject
的 RecordSet,但您的字段 result_ids
具有共同模型 schoolresults.detail
。那是错误的;-)
我可以通过覆盖 default_get
方法来做到这一点:
def default_get(self, fields):
res = super(student_student, self).default_get(fields)
srd = self.env['schoolresults.detail']
ids=[]
school_result={'subject_id':1,'result':0} #dict for fields and their values
sr = srd.create(school_result)
ids.append(sr.id)
res['result_ids'] = ids
return res
这是为 one2many 字段覆盖 default_get
的方法。
致谢:
result_ids = fields.Many2many("schoolresults.detail", "student_id", "School Results", default="_get_subjects")
def get_default_lines(self):
obj = self.env['your.class.name'].search([])
return obj
尝试将 many2many 字段添加到您的 class。
请阅读这篇文章如果你想从操作中设置one2many字段的默认值,你可以创建一个元组列表,其格式与我们用于创建或编写one2many的格式相同字段,然后您可以将其传递给上下文。 您可以复制您的上下文-
context = self.env.context.copy()
像这样准备 one2many 值--
pr_lines = []
for pr_line in pr_obj.line_ids: #loop for multiple lines.
pr_lines.append((0,0, {
'purchase_request_id' : pr_obj.id,
'product_id' : pr_line.product_id.id,
'description' : pr_line.name,
'qty_transfer' : pr_line.product_qty,
'uom_id' : pr_line.product_uom_id.id,
}))
您可以像这样更新您的上下文-
context.update({
'default_warehouse_id': self.approving_matrix_id.warehouse.id,
'default_internal_transfer_receipt': pr_lines,
})
在动作中你可以像这样传递上下文 'context':上下文,