Odoo中文社区可以通过以下两个域名访问:shine-it.net , odoo.net.cn

由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解

本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

订单行信息的复制



  • 我想把以前建立的一个order_line的内容拷贝到正在创建的一个order_line上,拷贝动作发生在我在form的下拉框中选择了原来的order以后,我想通过on_change方法来实现:
        def onchange_linked_order(self, cr, uid, ids, order_id, context=None):
            logistic_order_obj = self.pool.get('logistic.order')
            val = {}
            if order_id:
                order = logistic_order_obj.browse(cr,uid,order_id,context)
                val = {'order_line' : [line._id for line in order.order_line]}
            return {'value':val}

    其中order_line是logistic.order上的一个字段
    'order_line': fields.one2many('logistic.order.line', 'order_id', 'Order Lines'),

    我这样做以后,我发现结果是在添加新的订单后,原来那张订单的行内容消失了。估计是在数据库里的映射发生了变化。我期望的行为是不影响原来的订单行。

    各位大侠有没有好的办法解决这个问题?


  • 管理员

    你将原来的订单行记录指向了新的订单了,旧订单当然就没有订单行数据了。你应该用copy的方法将订单行内容复制过来。



  • 你说得对。我这样修改了一下:
        def onchange_linked_order(self, cr, uid, ids, order_id, context=None):
            logistic_order_line_obj = self.pool.get('logistic.order.line')
            val = {}
            if order_id:
                order = self.browse(cr,uid,order_id,context)
                lines = [line._id for line in order.order_line]
                new_lines = logistic_order_line_obj.logistic_order_line_create(cr,uid,lines,context)
                val = {'order_line' : new_lines}
            return {'value':val}

    在logistic_order_line_create里我是用了create方法,导致required field,也就是这个
    'order_id': fields.many2one('logistic.order', 'Order Reference', ondelete='cascade', required=True)
    无法填。但是在创建Order的时候,实际上这个order_id还是未知的。

    这个问题如何解决?如果用copy来做的话,如何能够得到新的line的id传给"order_line"?


        def logistic_order_line_create(self, cr, uid, ids, context=None):
            if context is None:
                context = {}

            create_ids = []
           
            for line in self.browse(cr, uid, ids, context=context):
                vals = self.__prepare_logistic_order_line(cr, uid, line, context)
                if vals:
                    inv_id = self.pool.get('logistic.order.line').create(cr, uid, vals, context=context)
                    create_ids.append(inv_id)
            return create_ids



  • 我现在采用copy_data的方式来做,
        def logistic_order_line_create(self, cr, uid, ids, context=None):
            if context is None:
                context = {}

            create_ids = []
           
            for line in self.browse(cr, uid, ids, context=context):
                vals = self.copy_data(cr, uid, line._id, context)
                if vals:
                    inv_id = self.pool.get('logistic.order.line').create(cr, uid, vals, context=context)
                    create_ids.append(inv_id)
            return create_ids
    再将
                new_lines = logistic_order_line_obj.logistic_order_line_create(cr,uid,lines,context)
                val = {'order_line' : new_lines}

    这样可以实现拷贝。但是如果我修改行上的内容,这个修改会产生如下效果:
    1.新订单上没有这一行
    2.link的订单上多了一行,值为修改后的内容。

    这个问题如何解决?

    [quote author=digitalsatori link=topic=8056.msg17674#msg17674 date=1374224613]
    你将原来的订单行记录指向了新的订单了,旧订单当然就没有订单行数据了。你应该用copy的方法将订单行内容复制过来。
    [/quote]



  • [(0,0, 你的订单行数据1), (0,0, 你的订单行数据2) ]




  • 谢谢斑竹~~问题已经解决。通过调试进入one2many的set函数,我理解了这个方法的含义。

    [quote author=mrshelly link=topic=8056.msg17702#msg17702 date=1374378529]
    [(0,0, 你的订单行数据1), (0,0, 你的订单行数据2) ]
    [/quote]


Log in to reply