You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将purchase.order中picking_type_id字段的默认值覆盖为非默认值

解决Odoo中purchase.order的picking_type_id字段默认值不生效的问题

看起来你是在旧版本的Odoo(用_columns和_defaults的版本,比如v8/v9)里尝试覆盖采购订单的picking_type_id字段设置,但代码没生效对吧?我帮你梳理几个常见的原因和解决办法:

1. 确认模型继承是否正确

首先最容易忽略的一点:你的自定义模型有没有正确继承purchase.order?如果没加_inherit = 'purchase.order',你的字段定义根本不会作用到采购订单模型上。正确的代码结构应该是这样:

from openerp import models, fields

class PurchaseOrderCustom(models.Model):
    _inherit = 'purchase.order'  # 这行必须要有!
    
    _columns = { 
        'picking_type_id': fields.many2one(
            'stock.picking.type', 
            'Deliver To', 
            help="This will determine picking type of incoming shipment", 
            required=False, 
            states={'confirmed': [('readonly', False)], 'approved': [('readonly', False)], 'done': [('readonly', True)]}
        ), 
    }
    _defaults = { 
        'picking_type_id': False 
    }

2. 检查模块加载顺序

如果有其他模块也在修改picking_type_id字段(比如库存模块或者其他自定义模块),而你的模块加载顺序在它们之前,那么你的设置会被后面的模块覆盖。解决办法是:

  • 在你的模块的__openerp__.py(或__manifest__.py)里,把那些修改该字段的模块加到depends列表里,确保你的模块在它们之后加载。比如:
'depends': ['purchase', 'stock'],  # 如果stock模块也改了这个字段,就加上它

3. 尝试用函数式默认值替代直接赋值

有时候直接给_defaults赋值静态值(比如False)可能会被Odoo的默认逻辑覆盖,尤其是原模型的picking_type_id有动态默认值的情况。你可以换成函数式默认值来强制覆盖:

def _get_default_picking_type(self, cr, uid, context=None):
    # 这里可以写自定义逻辑,比如返回你想要的拣货类型ID,或者直接返回False
    return False

_defaults = { 
    'picking_type_id': _get_default_picking_type 
}

4. 清理缓存并升级模块

Odoo有时候会缓存旧的字段定义,导致新设置不生效。试试这几步:

  • 重启Odoo服务
  • 在后台应用列表里找到你的模块,点击「升级」
  • 刷新页面后再创建新的采购订单测试

5. 检查视图是否有冲突

如果你的模块没有修改对应的采购订单视图,可能视图里还是引用了原模型的字段默认值。可以尝试:

  • 继承采购订单的表单视图,明确指定picking_type_id字段的属性
  • 确保视图的继承优先级正确,你的视图修改能生效

按照这几步排查下来,应该能解决你的问题啦!

内容的提问来源于stack exchange,提问作者Yasmine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:04:06