无法在Django中使用pickle对字典进行序列化

3

我有一个简单的字典,想要将其保存到缓存中。看起来 Django 正在尝试对其进行 pickle 处理:

  podcasts = []
  for i in items:
        s = re.sub('[\s+]', '', str(i))
        s2 = re.findall(r'<link/>(.*?)<itunes',s)[0]

        item_obj = {}
        item_obj['title'] = title
        item_obj['url'] = s2
        item_obj['created_at'] = created_at
        item_obj['duration'] = duration

        podcasts.append(item_obj)

这有一个非常简单的格式,输出如下:
[{'title': "Podcast1", 'url': 'https://example.com\\n', 'created_at': 'Thu, 28 Dec 2017', 'duration': '00:30:34'}]

我正在使用自定义管理命令运行以下内容:

python3 manage.py podcast_job

我尝试将内容保存到缓存:

    podcasts = get_podcasts()
    print(podcasts)
    cache.set('podcasts', podcasts)

I get the error:

File "podcast_job.py", line 13, in handle
    cache.set('podcasts', podcasts)
  File "python3.6/site-packages/django_redis/cache.py", line 33, in _decorator
    return method(self, *args, **kwargs)
  File "python3.6/site-packages/django_redis/cache.py", line 68, in set
    return self.client.set(*args, **kwargs)
  File "python3.6/site-packages/django_redis/client/default.py", line 109, in set
    nvalue = self.encode(value)
  File "python3.6/site-packages/django_redis/client/default.py", line 329, in encode
    value = self._serializer.dumps(value)
  File "python3.6/site-packages/django_redis/serializers/pickle.py", line 33, in dumps
    return pickle.dumps(value, self._pickle_version)

RecursionError: maximum recursion depth exceeded while calling a Python object 

如果我尝试使用字符串保存,没有出现错误并且成功保存:

   cache.set('podcasts', str(podcasts))

我该如何保存字典列表而不出现上述错误?

请编辑您的问题以显示如何最初创建item_obj - John Gordon
这是您第二次询问此错误,但我仍然认为您未提供足够的信息来再现此错误。请展示完整的无法运行的管理命令。 - Alasdair
@Alasdair 我猜在Python3中,缓存需要以JSON格式存储,而不是字典?这解决了我的问题。但你是Python大师,你可以告诉我。 - Atma
3个回答

2

如果您正在使用datetime对象来表示created_atduration,请确保将它们渲染为字符串。


听起来很有趣。你能详细说明一下吗?基本上,如果不必要的话,每个对象都不应该被 pickled。 - Jean-François Fabre
一个Python的datetime对象包含了一些无法转换为字符串或调用的内容(例如类方法)。看起来它可能会调用像.now()这样返回另一个datetime对象的方法,并且不断重复这个过程,直到达到递归深度。 - Dash Winterson

1

0
我按照Jacob的建议用json转换了字典,代码如下:
cache.set('podcasts', json.dumps(podcasts))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接