You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django 2.0合并普通字典与有序字典报错:unsupported operand type(s) for +

在Django 2.0中合并普通字典与有序字典的解决方案

嗨,我之前刚好踩过这个坑!你遇到的unsupported operand type(s) for +: 'dict_items' and 'odict_items'错误,本质是Python 3和Python 2在dict.items()返回值上的差异——Python 3里这个方法返回的是字典视图对象,不再是列表,所以没法直接用+来拼接;而self._current作为有序字典(OrderedDict),它的items()返回的也是类似的视图对象,自然没法相加。

给你几个靠谱的解决方法:

方法1:转换为列表后拼接

把两个字典的items()都转换成列表,再用+拼接,最后转成字典:

def get_dump_object(self, obj):
    metadata = { 
        "pk": smart_text(obj._get_pk_val(), strings_only=True), 
        "model": smart_text(obj._meta), 
    }
    return dict(list(metadata.items()) + list(self._current.items()))

注意:如果两个字典有重复的键,后面的字典(也就是self._current)的键值会覆盖前面的(metadata)。

方法2:用字典解包语法(推荐)

Python 3.5及以上支持这种简洁的写法,可读性和效率都不错:

def get_dump_object(self, obj):
    metadata = { 
        "pk": smart_text(obj._get_pk_val(), strings_only=True), 
        "model": smart_text(obj._meta), 
    }
    return {**metadata, **self._current}

同样,重复键的情况下,后面的self._current会覆盖metadata的对应值。

方法3:保留有序字典的顺序

如果需要保留self._current的有序特性(毕竟它是OrderedDict),可以先复制有序字典,再用update方法合并:

from collections import OrderedDict

def get_dump_object(self, obj):
    metadata = { 
        "pk": smart_text(obj._get_pk_val(), strings_only=True), 
        "model": smart_text(obj._meta), 
    }
    # 把metadata的内容合并到有序字典self._current中,保留原有序顺序
    result = OrderedDict(self._current)
    result.update(metadata)
    # 如果想让metadata的键排在前面,就反过来:
    # result = OrderedDict(metadata)
    # result.update(self._current)
    return result

这种方式能严格控制最终字典的键顺序,适合对顺序有要求的场景。

内容的提问来源于stack exchange,提问作者tread

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:57:02