Search code examples
odooodoo-12odoo-13odoo-14odoo-15

How can i update One2many field on Create method?


class DownloadReport(models.Model):
    _name = "santex.download_report"

    agency = fields.Many2one("res.partner", string="Agency",
                             domain="[('is_company', '=', True), '|' ,('company_type_santex','=','Supplier/Vendor'), ('company_type_santex','=','Supplier Agency')]")

    report = fields.Binary(string="Report")
    file_name = fields.Text(string="Name", copy=False)
    customer_auth = fields.One2many("santex.customer_auth", inverse_name="company_skills")
    licensor_auth = fields.One2many("santex.licensor_auth", inverse_name="company_skills")
    certification_auth = fields.One2many("santex.certification_auth", inverse_name="company_skills")

    @api.model
    def create(self, vals_list):
        recs_1 = self.env['santex.customer_auth'].create({'agency': vals_list["agency"]})
        recs_2 = self.env['santex.licensor_auth'].create({'agency': vals_list["agency"]})
        recs_3 = self.env['santex.certification_auth'].create({'agency': vals_list["agency"]})

        vals_list["customer_auth"] = recs_1
        vals_list["licensor_auth"] = recs_2
        vals_list["certification_auth"] = recs_3

        record = super(DownloadReport, self).create(vals_list)

        return record

For information:

    recs_1 = [santex.customer_auth(75,), santex.customer_auth(76,)]
    
    recs_2 = [santex.licensor_auth(65,), santex.licensor_auth(66,)]
    
    recs_3 = [santex.certification_auth(33,)]

Well, it seems like vals_list["customer_auth"] = rec_1 is wrong.

i am getting this error : psycopg2.ProgrammingError: can't adapt type 'santex.customer_auth'

Thanks for any help.


Solution

  • The error you're encountering, psycopg2.ProgrammingError: can't adapt type 'santex.customer_auth', occurs because you're trying to assign a recordset (rec_1, rec_2, rec_3) to the vals_list dictionary, which is not a supported data type for the fields customer_auth, licensor_auth, and certification_auth.

    You can try this to fix this:

    class DownloadReport(models.Model):
        _name = "santex.download_report"
    
        agency = fields.Many2one("res.partner", string="Agency",
        domain="[('is_company', '=', True), '|', ('company_type_santex', '=', 'Supplier/Vendor'), ('company_type_santex', '=', 'Supplier Agency')]")
    
        report = fields.Binary(string="Report")
        file_name = fields.Text(string="Name", copy=False)
        customer_auth = fields.One2many("santex.customer_auth", inverse_name="company_skills")
        licensor_auth = fields.One2many("santex.licensor_auth", inverse_name="company_skills")
        certification_auth = fields.One2many("santex.certification_auth", inverse_name="company_skills")
        @api.model
        def create(self, vals_list):
            recs_1 = self.env['santex.customer_auth'].create({'agency': vals_list["agency"]})
            recs_2 = self.env['santex.licensor_auth'].create({'agency': vals_list["agency"]})
            recs_3 = self.env['santex.certification_auth'].create({'agency': vals_list["agency"]})
     
            vals_list["customer_auth"] = [(4, rec.id) for rec in recs_1]
            vals_list["licensor_auth"] = [(4, rec.id) for rec in recs_2]
            vals_list["certification_auth"] = [(4, rec.id) for rec in recs_3]
     
            record = super(DownloadReport, self).create(vals_list)
     
            return record
    

    Thanks