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

use*_*102 1 django json django-models django-queryset django-serializer

我无法将 ValuesQuerySet 对象序列化为 json 数据,i\xc2\xb4ve 找到了解决此差距的多种解决方案,但这种情况有所不同,因为我需要遵循外键值。

\n\n
from task_manager.models import UserTasks\ndata=UserTasks.objects.filter(user__username="root",server_id=2).values("server_id__mnemonic")\n
Run Code Online (Sandbox Code Playgroud)\n\n

前面的查询返回类似这样的内容:

\n\n
>>> print data\n[{\'server_id__mnemonic\': u\'lol\'}, {\'server_id__mnemonic\': u\'lol\'}, {\'server_id__mnemonic\': u\'lol\'},.......]\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

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

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

\n\n
from django.core import serializers\ndata = serializers.serialize(\'xml\', SomeModel.objects.all(), fields=(\'name\',\'size\'))\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

谢谢

\n

ale*_*cxe 5

values()为您提供了一个ValuesQuerySet,您可以通过将其转换为list并使用json模块来序列化,无需serializers在这里涉及 Django:

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))
Run Code Online (Sandbox Code Playgroud)

serializers.serialize()另一个选项将与指定fields参数一起使用:

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