<p>问题是pickle通过引用序列化类,所以您不能使用一个更好的序列化器,通过序列化类定义而不是通过引用来pickle类吗?然后将pickle一个mock对象,然后pickle类源代码,然后将其传递给django缓存。我是<code>dill</code>的作者,这是一个更好的序列化程序……也是<code>klepto</code>的作者,这是一个缓存包……这正是我将任何对象存储在SQL表、磁盘或内存缓存中的方法。在</p>
<p>基本上(不是尝试这个,而是根据我自己的缓存包的经验来猜测它的工作原理),它应该是这样工作的:</p>
<pre><code>>>> from django.core.cache import get_cache
>>> import dill
>>>
>>> cache = get_cache('django.core.cache.backends.locmem.LocMemCache')
>>>
>>> # Set the 'content' cache key to a string
>>> cache.set('content', dill.dumps('a string'))
>>> dill.loads(cache.get('content'))
'a string'
>>>
>>> class TestObj(object):
... pass
>>>
>>> a = TestObj()
>>> cache.set('content', dill.dumps(a))
>>>
>>> dill.loads(cache.get('content'))
<__main__.TestObj object at 0x10235e510>
>>>
>>> # this is pickling classes w/o using a reference
>>> dill.dumps(a)
'\x80\x02cdill.dill\n_create_type\nq\x00(cdill.dill\n_load_type\nq\x01U\x08TypeTypeq\x02\x85q\x03Rq\x04U\x07TestObjq\x05h\x01U\nObjectTypeq\x06\x85q\x07Rq\x08\x85q\t}q\n(U\r__slotnames__q\x0b]q\x0cU\n__module__q\rU\x08__main__q\x0eU\x07__doc__q\x0fNutq\x10Rq\x11)\x81q\x12}q\x13b.'
>>> # and here's using a reference, which is exactly how pickle does it
>>> dill.dumps(a, byref=True)
'\x80\x02c__main__\nTestObj\nq\x00)\x81q\x01}q\x02b.'
</code></pre>
<p>如果您想自己尝试一下,请在此处获得<code>dill</code>(和<code>klepto</code>):<a href="https://github.com/uqfoundation" rel="noreferrer">https://github.com/uqfoundation</a></p>