Елемент послідовності оновлення словника № 0 має довжину 3; Потрібно 2


77

Я хочу додати рядки до об'єкта account.bank.statement.lineчерез інший об'єкт, але я отримую таку помилку:

"Елемент послідовності оновлення словника # 0 має довжину 3; необхідний 2"

Ось мій код:

def action_account_line_create(self, cr, uid, ids):
    res = False
    cash_id = self.pool.get('account.bank.statement.line')
    for exp in self.browse(cr, uid, ids):
        company_id = exp.company_id.id
        #statement_id = exp.statement_id.id
        lines = []
        for l in exp.line_ids:
            lines.append((0, 0, {
                'name': l.name,
                'date': l.date,
                'amount': l.amount,
                'type': l.type,
                'statement_id': exp.statement_id.id,
                'account_id': l.account_id.id,
                'account_analytic_id': l.analytic_account_id.id,
                'ref': l.ref,
                'note': l.note,
                'company_id': l.company_id.id
            }))

        inv_id = cash_id.create(cr, uid, lines,context=None)
        res = inv_id
    return res 

Я змінив це на цьому, але потім натрапив на цю помилку:

  File "C:\Program Files (x86)\OpenERP 6.1-20121029-003136\Server\server\.\openerp\workflow\wkf_expr.py", line 68, in execute
  File "C:\Program Files (x86)\OpenERP 6.1-20121029-003136\Server\server\.\openerp\workflow\wkf_expr.py", line 58, in _eval_expr
  File "C:\Program Files (x86)\OpenERP 6.1-20121029-003136\Server\server\.\openerp\tools\safe_eval.py", line 241, in safe_eval
  File "C:\Program Files (x86)\OpenERP 6.1-20121029-003136\Server\server\.\openerp\tools\safe_eval.py", line 108, in test_expr
  File "<string>", line 0   
   ^
SyntaxError: unexpected EOF while parsing

Код:

def action_account_line_create(self, cr, uid, ids, context=None):
    res = False
    cash_id = self.pool.get('account.bank.statement.line')
    for exp in self.browse(cr, uid, ids):
        company_id = exp.company_id.id
        lines = []
        for l in exp.line_ids:
            res = cash_id.create ( cr, uid, {
                'name': l.name,
                'date': l.date,
                'amount': l.amount,
                'type': l.type,
                'statement_id': exp.statement_id.id,
                'account_id': l.account_id.id,
                'account_analytic_id': l.analytic_account_id.id,
                'ref': l.ref,
                'note': l.note,
                'company_id': l.company_id.id
            }, context=None)
    return res

Який ваш поточний об'єкт / клас? Ви хочете створити рядок безпосередньо або ви хочете додати рядок як one2many у ваш поточний об'єкт? Тут проблема в тому, що ви не можете передати список у create (). Ви повинні передати словник.
Sudhir Arya

дякую за вашу відповідь, я змінив hr_expense_expense, щоб додати рядок безпосередньо в таблицю account_bank_statement_line після стану: 'підтвердити'
rindra

Відповіді:


83

Ця помилка виникла через те, що ви намагаєтесь оновити dictоб'єкт, використовуючи неправильну структуру послідовності ( listабо tuple).

cash_id.create(cr, uid, lines,context=None)намагається перетворити linesна об'єкт dict:

(0, 0, {
    'name': l.name,
    'date': l.date,
    'amount': l.amount,
    'type': l.type,
    'statement_id': exp.statement_id.id,
    'account_id': l.account_id.id,
    'account_analytic_id': l.analytic_account_id.id,
    'ref': l.ref,
    'note': l.note,
    'company_id': l.company_id.id
})

Видаліть другий нуль з цього кортежу, щоб правильно перетворити його в об'єкт dict.

Щоб перевірити це самостійно, спробуйте це в оболонці python:

>>> l=[(0,0,{'h':88})]
>>> a={}
>>> a.update(l)

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    a.update(l)
ValueError: dictionary update sequence element #0 has length 3; 2 is required

>>> l=[(0,{'h':88})]
>>> a.update(l)

17

Я отримав цю помилку, коли оновлював словник з неправильним синтаксисом:

Спробуйте з цим:

lineItem.values.update({attribute,value})

замість

lineItem.values.update({attribute:value})

Це має бути прийнятою відповіддю заради всіх, хто приходить сюди з Google
Йоші Асхарун,

@YoshiAskharoun прийнятою відповіддю є те, що допомогло ОП, а не те, що допомогло всім іншим
TheTechRobo36414519

3

Один із швидких способів створити дикт із кортежів однакової довжини:

>>> t1 = (a,b,c,d)
>>> t2 = (1,2,3,4)
>>> dict(zip(t1, t2))
{'a':1, 'b':2, 'c':3, 'd':4, }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.