在Django中将ValuesQuerySet对象序列化为json时出现问题

时间:2014-06-24 15:15:56

标签: json django django-models django-queryset django-serializer

我无法将ValuesQuerySet对象序列化为json数据,我发现了这个差距的多种解决方案,但是这种情况不同,因为我需要遵循外键值。

from task_manager.models import UserTasks
data=UserTasks.objects.filter(user__username="root",server_id=2).values("server_id__mnemonic")

上一个查询返回如下内容:

>>> print data
[{'server_id__mnemonic': u'lol'}, {'server_id__mnemonic': u'lol'}, {'server_id__mnemonic': u'lol'},.......]

但是当我尝试将其序列化为JSON格式时,会引发下一个异常:

>>> json_data = serializers.serialize('json',data)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Python27\lib\site-packages\django\core\serializers\__init__.py", line 122, in serialize
    s.serialize(queryset, **options)
  File "C:\Python27\lib\site-packages\django\core\serializers\base.py", line 45, in serialize
    concrete_model = obj._meta.concrete_model
AttributeError: 'dict' object has no attribute '_meta'
>>> type(data)
<class 'django.db.models.query.ValuesQuerySet'>

我在官方Django手册中找到了says的解决方案如果您只想序列化一个字段子集,可以为序列化器指定一个fields参数:

from django.core import serializers
data = serializers.serialize('xml', SomeModel.objects.all(), fields=('name','size'))

但是使用这段代码,我无法获得我想要的外键值。

由于

1 个答案:

答案 0 :(得分:4)

values()为您提供ValuesQuerySet,您可以将其转换为list并使用json模块进行序列化,无需在此处涉及Django serializers

import json
from task_manager.models import UserTasks

data = UserTasks.objects.filter(user__username="root",server_id=2).values("server_id__mnemonic")
print json.dumps(list(data))

另一个选项是使用serializers.serialize()并指定fields参数:

data = UserTasks.objects.filter(user__username="root",server_id=2)
print serializers.serialize('json', data, fields=('server_id__mnemonic', ))