Oralover
Oralover

Reputation: 93

odoo 14: ValueError: invalid literal for int() with base 10: 'categry_id.base_category'

when click on Many2one brand_id field in view (xml), it throwing error. ValueError: invalid literal for int() with base 10: 'categry_id.base_category'

added a computed field base_category in product.category which type is Integer, with help of @SDBot here. first in the domain of brand_id i didn't used int() but when searched for error above, i tried to use int('categry_id.base_category') but still getting same error.

below are 2 models, first in which i created base_category value -thanks to @SDBot-, (it is created from a Char type field and storing value in Integer type field and even after update values manually through psql the error is same) second is where i am getting error in the domain filter.

please help to solve the problem.

class ProductCateg(models.Model):
    _inherit = 'product.category'

    level = fields.Integer(string='Level', compute='_compute_level', store=True)
    base_category = fields.Integer('Base Cat', compute='_compute_basecat', store=True)

    @api.depends('parent_id')
    def _compute_level(self):
        for record in self:
            record.level = (record.parent_id.level or 0) + 1

    @api.depends('parent_id')
    def _compute_basecat(self):
        for rec in self:
            split_str = (rec.parent_path or '').split('/')
            rec.base_category = int(split_str[1]) if len(split_str) > 1 else ''


class OrderItems(models.Model):
    _name = 'tests.orderitems'
    _description = "Tests Order Items"

    store_id = fields.Many2one('tests.stores', string="Store", ondelete='cascade')
    order_id = fields.Many2one('tests.testsorders')
    categry_id = fields.Many2one('product.category', string="Category",
                                 domain="[['complete_name', 'not like', '%Brands%']]")
    items_id = fields.Many2one('tests.storeitems', string="Item",
                               domain="[['categs_id', '=', categry_id]]")
    brand_id = fields.Many2one('product.category', string="Brand",
                               domain=[('base_category', '=', int('categry_id.base_category')),('complete_name', 'like', '%Brands%')])

Upvotes: 0

Views: 1666

Answers (3)

SDBot
SDBot

Reputation: 834

You need to show the value within the tests.orderitems first:

    categry_id = fields.Many2one('product.category', string="Category",
                                 domain="[['complete_name', 'not like', '%Brands%']]")
    base_category = fields.Integer('Base Cat', related='categry_id.base_category')
    brand_id = fields.Many2one('product.category', string="Brand",
                               domain="[('base_category', '=', base_category),('complete_name', 'like', '%Brands%')])"

Upvotes: 1

CZoellner
CZoellner

Reputation: 14801

A field of type Integer is expecting an integer. So just give it an integer in your else part. Odoo is setting 0 as default and you can't set None in form of database NULL.

rec.base_category = int(split_str[1]) if len(split_str) > 1 else 0

Upvotes: 0

lllrnr101
lllrnr101

Reputation: 2343

The defaul value you put should be 0 not '' for an int.

rec.base_category = int(split_str[1]) if len(split_str) > 1 else ''

Upvotes: 0

Related Questions