为 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':上下文,