ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 这些瞬态模型的ID会发生什么?

2019-10-02 16:56:39  阅读:326  来源: 互联网

标签:odoo odoo-8 python python-2-7


编码

我有以下瞬态模型:

class MoveLotsManager(models.TransientModel):
    _name = 'move.lots.manager'

    product_lots_available = fields.One2many(
        comodel_name='move.product.lot.available',
        inverse_name='manager_id',
        string='Available lots',
    )

class MoveProductLotAvailable(models.TransientModel):
    _name = 'move.product.lot.available'

    manager_id = fields.Many2one(
        comodel_name='move.lots.manager',
        string='Lots Manager',
    )
    name = fields.Char(
        string='Name',
    )

    @api.one
    @api.onchange('name')
    def onchange_name(self):
        # LOGGER 4
        _logger.info(self.manager_id)
        # LOGGER 5
        _logger.info(self.manager_id.id)

如您所见,它们都通过1:N关系连接.我用这种方式打开瞬态模型的视图:

@api.multi
def open_move_lots_manager_wizard(self):
    self.ensure_one()
    wizard_id = self.env.ref(
        'my_module.view_move_lots_manager_wizard').id
    default_lots = [(
        (0, 0, {
            'name': 'My lot',
        })
    )]
    lots_manager = self.env['move.lots.manager'].create({
        'product_lots_available': default_lots,
    })
    # LOGGER 1
    _logger.info(lots_manager)
    # LOGGER 2
    _logger.info(lots_manager.id)
    # LOGGER 3
    _logger.info(lots_manager.product_lots_available.mapped('manager_id'))
    return {
        'name': _('Lots manager'),
        'view_type': 'form',
        'view_mode': 'form',
        'view_id': False,
        'res_id': lots_manager.id,
        'views': [(wizard_id, 'form'), ],
        'res_model': 'move.lots.manager',
        'type': 'ir.actions.act_window',
        'target': 'new',
        'flags': {
            'form': {
                'action_buttons': False,
            },
        },
    }

我的目的

在模型move.product.lot.available的onchange_name方法中,我想访问其相关的管理器(及其字段).

预期的行为

想象一下,我刚创建的move.lots.manager有ID 11.

LOGGER 1: move.lots.manager(11,)
LOGGER 2: 11
LOGGER 3: move.lots.manager(11,)
LOGGER 4: move.lots.manager(11,)
LOGGER 5: 11

当前的行为

LOGGER 1: move.lots.manager(11,)
LOGGER 2: 11
LOGGER 3: move.lots.manager(11,)
LOGGER 4: move.lots.manager(<openerp.models.NewId object at 0x7fd1a60cb850>,)
LOGGER 5: <openerp.models.NewId object at 0x7fd1a60cb850>

我的问题

我知道瞬态模型不是永久存储的,根据数据库的系统参数,它们会在一段时间后被删除.但是,虽然他们在数据库中,但他们确实有一个ID.事实上,当我打开瞬态模型表单(激活开发人员模式)并点击View Metadata选项后,我可以看到ID:11 …所以为什么我不能从“孩子”瞬态模型中获取它?

解决方法:

看看onchange() line 4971 and following.Odoo正在缓存/内存中创建一个新记录,稍后,在onchange完成后,将使用提供的数据更新自己的缓存.

如果您确实需要ID或其他字段,请使用< record> ._ origin.< field>.

编辑:不要在onchange方法上使用api.one装饰器.无论如何,它们都是在单身记录上触发的.

标签:odoo,odoo-8,python,python-2-7
来源: https://codeday.me/bug/20191002/1843696.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有