簡體   English   中英

AttributeError:“ NoneType”對象沒有屬性“ id”-Odoo v8

[英]AttributeError: 'NoneType' object has no attribute 'id' - Odoo v8

此方法將在draft state更改時寫入表單name ,以confirm

production_type = fields.Selection([
    ('budgeted','Budgeted'),
    ('nonbudgeted','Non Budgeted'),
    ('direct','Direct Order'),
], string='Type of Order', index=True, copy=False,
help=" ")
state = fields.Selection([
        ('draft','Draft'),
        ('confirm','Confirmed'),
        ('inprogress','In progress'),
        ('print_order_inprogress','Print In Progress'),
        ('finished','Finished'),
        ('cancel','Cancel'),
    ], string='State', index=True, copy=False,
    help=" ")

@api.one
def prod_start_func(self):
    name = '/'
    if self.production_type == 'budgeted':
            name = self.env['ir.sequence'].next_by_code('bsi.production.budgeted') or '/'
    elif self.production_type == 'nonbudgeted':
            name = self.env['ir.sequence'].next_by_code('bsi.production.non_budgeted') or '/'
    elif self.production_type == 'direct':
            name = self.env['ir.sequence'].next_by_code('bsi.production.direct') or '/'

    self.write({
            'state': 'confirm',
            'name' : lambda self, cr, uid, context: self.pool.get('ir.sequence').next_by_code(cr, uid, 'bsi.production.order') or '',
            })

但是每次我嘗試保存它時,都會拋出以下信息:

Traceback (most recent call last):
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\http.py", line 546, in _handle_exception
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\http.py", line 583, in dispatch
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\http.py", line 319, in _call_function
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\service\model.py", line 118, in wrapper
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\http.py", line 316, in checked_call
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\http.py", line 812, in __call__
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\http.py", line 412, in response_wrap
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\openerp\addons\web\controllers\main.py", line 944, in call_kw
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\openerp\addons\web\controllers\main.py", line 936, in _call_kw
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\api.py", line 268, in wrapper
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\api.py", line 373, in old_api
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\api.py", line 291, in <lambda>
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\models.py", line 4057, in <lambda>
AttributeError: 'NoneType' object has no attribute 'id'

我認為這與'name' : lambda self, cr, uid, context: self.pool.get('ir.sequence').next_by_code(cr, uid, 'bsi.production.order') or '',這一行有關'name' : lambda self, cr, uid, context: self.pool.get('ir.sequence').next_by_code(cr, uid, 'bsi.production.order') or '',但如果將其更改為'name': name,得到相同的結果。

有任何想法嗎?

您正在嘗試在新api中使用舊api格式

試試這個: '名字':lambda self:self.env ['ir.sequence']。next_by_code('bsi.production.order')或'/'

還要確保自身包含單個記錄(因為您使用的是@ api.one)

如果它包含多個記錄,請使用@ api.multi

並且沒有記錄集可用@ api.model

我想我知道問題是因為我的最后一個答案,您從create方法中刪除了return語句,這是錯誤的,您應該保留它,我以為您知道這一點。

      @model
      create(self, vals):
              ....
               ....
               return super(bsi_production_order, self).create(vals)

因為當don odoo創建時,期望該方法返回一個對象,並且在您的情況下,您刪除了return語句,因此該調用默認情況下將返回None。 當odoo tryies訪問返回的記錄的ID(記錄=無)時,他引發此錯誤。

請記住,當您覆蓋create或write時,此規則始終調用super,因為創建的真正工作在models.py中。 並且odoo希望write方法返回True。

另一個示例,例如,如果需要在創建方法之后執行邏輯

      @model
       create(self, vals):
          ....
          ....
          record = super(bsi_production_order, self).create(vals)
          ......
          ......
           # always return the object that is created
           return record

在write方法中,在這種情況下只需返回True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM