django错误 ValueError: Circular reference detected 解决方法

前端之家收集整理的这篇文章主要介绍了django错误 ValueError: Circular reference detected 解决方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

django 错误:ValueError: Circular reference detected,具体错误信息:

File "C:\Python27\MyDjango\jianzhi_002\jianzhi_app\views.py", line 418, in wx_get_job_detail
    return HttpResponse(json.dumps({'message': message, 'data': detail_data}))
File "C:\Python27\lib\json\__init__.py", line 244, in dumps
    return _default_encoder.encode(obj)
File "C:\Python27\lib\json\encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
File "C:\Python27\lib\json\encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
ValueError: Circular reference detected

错误意思:存在循环引用。

代码重现:

import json

a = b = c = {}
# 将b c 存到 a
a['b'] = b
a['c'] = c
json.dumps(a)

错误提示

ValueError                                Traceback (most recent call last)
<ipython-input-5-2f50cf32d976> in <module>()
----> 1 json.dumps(a)

/usr/lib/python2.7/json/__init__.pyc in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, encoding, default, sort_keys, **kw)
    241         cls is None and indent is None and separators is None and
    242         encoding == 'utf-8' and default is None and not sort_keys and not kw):
--> 243         return _default_encoder.encode(obj)
    244     if cls is None:
    245         cls = JSONEncoder

/usr/lib/python2.7/json/encoder.pyc in encode(self, o)
    205         # exceptions aren't as detailed.  The list call should be roughly
    206         # equivalent to the PySequence_Fast that ''.join() would do.
--> 207         chunks = self.iterencode(o, _one_shot=True)
    208         if not isinstance(chunks, (list, tuple)):
    209             chunks = list(chunks)

/usr/lib/python2.7/json/encoder.pyc in iterencode(self, o, _one_shot)
    268                 self.key_separator, self.item_separator, self.sort_keys,    269                 self.skipkeys, _one_shot)
--> 270         return _iterencode(o, 0)
    271 
    272 def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,ValueError: Circular reference detected

究其原因,是因为 a b c 实际上指向的是同一个对象的引用。

解决办法:

import json

a, b , c = {}, {}, {}
# 将b c 存到 a
a['b'] = b
a['c'] = c
json.dumps(a)

总结:

一般遇到ValueError: Circular reference detected错误,是因为同一个变量被循环引用导致的bug。检查代码中哪一个变量被循环引用,更改变量名就可以。

猜你在找的Django相关文章