【问题标题】:Why does python refuse to serialize this dictionary under a special case为什么python在特殊情况下拒绝序列化这个字典
【发布时间】:2013-12-26 04:36:45
【问题描述】:

我正在使用以下库:Django 1.6.1、python 3.3.2 和 django-restless 0.0.7。我有一个视图,它使用 django-restless 提供的序列化方法将用户序列化为 json 对象,在此处找到http://django-restless.readthedocs.org/en/latest/#restless.models.serialize。实现后的样子

fields = [
    'pk',
    'username',
    'job_title',
    'company',
    'interests',
    'email',
    'website',
    'image',
    ('posts', lambda user: user.get_posts())
]
serialized_user = serialize(request.user, fields=fields)
print(type(serialized_user), serialized_user)

然后给出类似的东西

<class 'dict'> {'posts': [], 'interests': None, 
'image': 'https://secure.gravatar.com/avatar/', 'company': None, 
'email': None, 'job_title': None, 'username': 'user-94376642', 'pk': 3, 
'website': None}

奇怪的是当我在 serialized_user 上调用 json.dumps 时;也就是说,

json.dumps(serailzed_user)

我得到了错误

[] is not JSON serializable

现在,如果我将输出复制到单独的字典中,它会正常序列化并且不会返回错误。这是为什么呢?


更新

我按照说明更改了代码,它给了我一个 AttributeError

AttributeError
'str' object has no attribute '_meta'

在 django/core/serializers/base.py 文件中

concrete_model = obj._meta.concrete_model 

我还从堆栈跟踪中传递了以下信息,

obj 'interests'
self <django.core.serializers.json.Serializer object at 0x7f37037ca690>
queryset    
{'company': None,
 'email': None,
 'image': 'https://secure.gravatar.com/avatar/',
 'interests': None,
 'job_title': None,
 'pk': 3,
 'posts': [],
 'username': 'user-94376642',
 'website': None}
options{}

【问题讨论】:

  • 从 django.forms.models 中尝试 model_to_dict 自定义 django 方法 import model_to_dict model_to_dict(instance, fields=[], exclude=[])
  • 这是否支持 lambdas 的用户,或从模型调用函数?
  • 我不知道试试看,但是你为什么要这么做?
  • 我需要调用一个函数,该函数返回以特殊方式序列化的其他模型,这些模型引用了用户

标签: python django json serialization


【解决方案1】:

我假设您的 get_posts 方法返回一个查询集?

而且,当您执行json.dumps(serialized_user) 时,您使用的是Python 内置的json 模块,即import json

所以你有两个问题:

  1. Django 查询集是一个惰性对象...当您print(serialized_user) 时会对其进行评估,这就是您在那里看到空列表的原因,但当您尝试序列化它时它实际上并不是一个空列表,它是一个 Django @ 987654328@对象
  2. Python 的 json 模块无法序列化 Django QuerySet 对象

编辑

为此,我们不能只使用 Django 提供的自定义 JSON 序列化程序:
https://docs.djangoproject.com/en/dev/topics/serialization/#serializing-data

...因为它适用于 Django QuerySet 或模型实例,但这里我们有一个 dict(包含一个查询集)。

看看an example in the Restless docs,你似乎最好找到一种方法,让你想序列化的字典中没有查询集,例如:

fields = [
    'pk',
    'username',
    'job_title',
    'company',
    'interests',
    'email',
    'website',
    'image',
    ('posts', lambda user: list(user.get_posts().values()))
]

在这种情况下,您不再需要 Django 序列化程序,您可以返回 json.dumps(serialized_user)

【讨论】:

  • 这会引发 django 序列化程序的错误。除了文档提供的内容之外,您还知道使用 json 序列化程序的任何示例吗?
  • 嗯,我明白了,Django 序列化程序适用于 Django 查询集,而这里我们有一个包含查询集的字典
  • 你说得对,我没有指定嵌套字段。我将对我的问题进行更正
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多