【问题标题】:Django: TypeError: <MuzejskiPredmet: > is not JSON serializableDjango: TypeError: <MuzejskiPredmet: > is not JSON serializable
【发布时间】:2013-11-24 11:51:12
【问题描述】:

我的观点如下(代码有点多,get或者post的时候怎么做等,但和问题无关):

@login_required
def muzejskipredmetadd(request):
    if not 'predmet' in request.session:
        request.session['predmet'] = MuzejskiPredmet()
    tipoviPredmeta = TipPredmeta.objects.all()
    return render_to_response("azuriranje/muzejskiPredmetForm.html",
                              {'predmet': predmet, 'tipoviPredmeta': tipoviPredmeta},
                              context_instance=RequestContext(request))

我收到标题中的错误。现在,权威指南指出会话字典接受任何能够被腌制的 Python 对象。虽然我的 MuzejskiPredmet 类扩展了 django.models.Model 我不知道这是否足以被认为是“可腌制的”。

我一直在网上阅读,虽然有很多关于具有“原始”字段的简单类的示例,但我不确定当我有 ForeignKey 字段或 ManyToMany 字段时该怎么办.在酸洗方面如何与他们合作?

因此,这段代码背后的整个想法是,我希望我的用户能够从这个表单跳转到为组合框添加新对象(其中包含与外键相关的对象)。一旦用户创建了相关对象(在新表单中),我想返回到这个,但我不想得到一个清晰的表单,而是用户在他去创建一个新条目之前留下的表单组合框,因此需要会话属性。请注意,我什至不确定这是否可行,也不确定这是否是处理此问题的正确方法。

追溯:

Environment:


Request Method: GET
Request URL: http://localhost:8000/azuriranje/muzejski-predmet/dodavanje/

Django Version: 1.5.4
Python Version: 2.7.5
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'django_tables2',
 'BackOffice')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  187.                 response = middleware_method(request, response)
File "C:\Python27\lib\site-packages\django\contrib\sessions\middleware.py" in process_response
  38.                     request.session.save()
File "C:\Python27\lib\site-packages\django\contrib\sessions\backends\db.py" in save
  51.             session_data=self.encode(self._get_session(no_load=must_create)),
File "C:\Python27\lib\site-packages\django\contrib\sessions\backends\base.py" in encode
  84.         serialized = self.serializer().dumps(session_dict)
File "C:\Python27\lib\site-packages\django\core\signing.py" in dumps
  100.         return json.dumps(obj, separators=(',', ':')).encode('latin-1')
File "C:\Python27\lib\json\__init__.py" in dumps
  250.         sort_keys=sort_keys, **kw).encode(obj)
File "C:\Python27\lib\json\encoder.py" in encode
  207.         chunks = self.iterencode(o, _one_shot=True)
File "C:\Python27\lib\json\encoder.py" in iterencode
  270.         return _iterencode(o, 0)
File "C:\Python27\lib\json\encoder.py" in default
  184.         raise TypeError(repr(o) + " is not JSON serializable")

Exception Type: TypeError at /azuriranje/muzejski-predmet/dodavanje/
Exception Value: <MuzejskiPredmet: > is not JSON serializable

【问题讨论】:

  • 您确定这是导致问题的代码吗?你在哪里定义predmet
  • 嗯,问题是,我为我的 MuzejskiPredmet 对象创建了一个自定义表单,这样我就可以在相关对象的字段旁边添加一个 (+) 按钮(外键,多对多) 这样我就可以跳转到该表单,添加一个新实体,然后返回。现在,由于我不希望我的用户必须重写所有我认为将其存储在会话中的信息会有所帮助(尽管即使这样我仍然无法测试)。话虽如此,我仅在第一次访问表单时放置“predmet”,并在保存实体时将其删除(最后,尽管此处未显示)。
  • 您需要显示更多代码并准确解释发生了什么。首先显示完整的错误消息(回溯)。
  • 好的,我已经添加了更多解释和回溯。
  • request.session['predmet'] = MuzejskiPredmet.objects.create()替换request.session['predmet'] = MuzejskiPredmet()

标签: python django json


【解决方案1】:

我不确定这些对象代表什么,但您可以尝试:

@login_required
def muzejskipredmetadd(request):
    if not 'predmet' in request.session:
        predmet = MuzejskiPredmet()
        predmet.save()
        request.session['predmet'] = predmet.pk
    else:
        predmet = MuzejskiPremet.objects.get(pk = request.session['predmet'])
    tipoviPredmeta = TipPredmeta.objects.all()
    return render_to_response("azuriranje/muzejskiPredmetForm.html",
                              {'predmet': predmet, 'tipoviPredmeta': tipoviPredmeta},
                              context_instance=RequestContext(request))

这会将predmet 对象保存到数据库中,并将其主键值存储到会话中。如果主键已经在会话中,则会检索到正确的对象。

这样做的问题可能是可以创建和存储大量此类对象,因此可能需要一个垃圾收集例程来删除旧对象。

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2019-05-06
    • 2019-10-09
    • 2021-03-02
    • 2017-05-10
    • 1970-01-01
    • 2012-02-16
    • 2021-09-19
    • 2014-10-14
    相关资源
    最近更新 更多