2013-05-14 3 views
1

Я пытаюсь протравить и unpickle структурированных данных в собственность ndb.PickleProperty() как так:Травления на GAE ОПРС

month = MonthRecord.get_or_insert(month_yr_str, parent=ndb.Key('Type','Grocery'), record=pickle.dumps(defaultdict(list_list))) 
names_dict = pickle.loads(month.record) # unpickle for updating 
# ...         # some modifications on names_dict 
month.record = pickle.dumps(names_dict) # pickle 
month.put()        # commit changes 

где модель MonthRecord определяются как:

class MonthRecord(ndb.Model): 
    record = ndb.PickleProperty() # {name: [[date&time],[expenses]]} 

и list_list как:

def list_list(): # placeholder function needed by pickle at module level 
    return [[],[]] 

Первый запуск работает нормально (где вставка случай попадания в get_or_insert, создавая новый MonthRe шнур). Тем не менее, в течение последующих опытов (т.е. новых расходов в течение текущего месяца для записи) возникает следующая ошибка:

Traceback (most recent call last): 
    File "C:\GAE_Projects\qb_lite\fin.py", line 31, in update_db 
    names_dict = pickle.loads(month.record) 
    File "C:\Python27\lib\pickle.py", line 1382, in loads 
    return Unpickler(file).load() 
    File "C:\Python27\lib\pickle.py", line 858, in load 
    dispatch[key](self) 
    File "C:\Python27\lib\pickle.py", line 1133, in load_reduce 
    value = func(*args) 
TypeError: __init__() takes exactly 4 arguments (1 given) 

Любые идеи, как на причину ошибки?

ответ

2

Вам не нужно мариновать свои объекты, которые будут обрабатывать PickleProperty.

Вместо:

month = MonthRecord.get_or_insert(
    month_yr_str, 
    parent=ndb.Key('Type','Grocery'), 
    record=pickle.dumps(defaultdict(list_list))) 

сделать:

month = MonthRecord.get_or_insert(
    month_yr_str, 
    parent=ndb.Key('Type','Grocery'), 
    record=defaultdict(list_list)) 

Травление и unpickling будут заботиться о внутренне.

+1

Проверено, есть ли дополнительное/избыточное травление или нет, код работает. Реальная причина проблемы заключается в том, что объекты datetime с tzinfo, которые не могут быть правильно рассорены, поскольку TimeZone не определен на уровне модуля. Исправлено удаление tzinfo в объектах datetime. Причина корня была обнаружена, когда я удалил лишний слой травления. Теперь используйте PickleProperty правильно. Благодарю. – silvernightstar