如何将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
相关产品推荐
相关产品推荐

