2
votes

Need some help please with this error :

TypeError: 'unicode' object does not support item assignment

Ligne : menuDic[str(menu.id)]['menuDishes'][str(d.dish.dishType.name)]['dishTypeName'][str(d.dish.id)] = {}

def getDishOfTheWeek():
    menuDic = Ddict(dict)
    for menu in Menus.select().where(state = True):
        menuDic[str(menu.id)]={}
        menuDic[str(menu.id)]['menuId']=menu.id
        menuDic[str(menu.id)]['menuName']=menu.name
        menuDic[str(menu.id)]['menuCountry']=menu.country.name
        menuDic[str(menu.id)]['menuDishes']={}
        for d in DishMenuRels.select().where(menu = menu.id).join(Dishes).join(DishTypes).order_by('name')
            menuDic[str(menu.id)]['menuDishes'][str(d.dish.dishType.name)] = {}
            menuDic[str(menu.id)]['menuDishes'][str(d.dish.dishType.name)]['dishTypeName'] = d.dish.dishType.name
            menuDic[str(menu.id)]['menuDishes'][str(d.dish.dishType.name)]['dishTypeName'][str(d.dish.id)] = {}
            menuDic[str(menu.id)]['menuDishes'][str(d.dish.dishType.name)]['dishTypeName'][str(d.dish.id)]['dishId'] = d.dish.id
            menuDic[str(menu.id)]['menuDishes'][str(d.dish.dishType.name)]['dishTypeName'][str(d.dish.id)]['dishState'] = d.dish.name
            menuDic[str(menu.id)]['menuDishes'][str(d.dish.dishType.name)]['dishTypeName'][str(d.dish.id)]['dishType'] = d.dish.price
            menuDic[str(menu.id)]['menuDishes'][str(d.dish.dishType.name)]['dishTypeName'][str(d.dish.id)]['dishName'] = d.dish.country.name
    print json.dumps(menuDic, indent=5, sort_keys=True)

Thanks

1

1 Answers

7
votes

Here, you assign the value d.dish.dishType.name, which appears to be a unicode string, to the dictionary key 'dishTypeName'.

        menuDic[str(menu.id)]['menuDishes'][str(d.dish.dishType.name)]\
               ['dishTypeName'] = d.dish.dishType.name

Then, you use item assignment on that value; the below is identical to d.dish.dishType.name[str(d.dish.id)] = {}.

        menuDic[str(menu.id)]['menuDishes'][str(d.dish.dishType.name)]\
               ['dishTypeName'][str(d.dish.id)] = {}

Needless to say, that results in an error, because d.dish.dishType.name is an immutable string.

May I add that you would be better off breaking these assignments apart into smaller pieces, perhaps with a few functions? These long assignment statements -- as I'm sure you've noticed -- are very hard to interpret and debug.