use*_*102 1 django json django-models django-queryset django-serializer
我无法将 ValuesQuerySet 对象序列化为 json 数据,i\xc2\xb4ve 找到了解决此差距的多种解决方案,但这种情况有所不同,因为我需要遵循外键值。
\n\nfrom task_manager.models import UserTasks\ndata=UserTasks.objects.filter(user__username="root",server_id=2).values("server_id__mnemonic")\nRun 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\'},.......]\nRun 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\'>\nRun Code Online (Sandbox Code Playgroud)\n\nI\xc2\xb4ve 在 Django 官方手册中找到了一个解决方案:如果您只想序列化字段的子集,则可以为序列化器指定一个 fields 参数:
\n\nfrom django.core import serializers\ndata = serializers.serialize(\'xml\', SomeModel.objects.all(), fields=(\'name\',\'size\'))\nRun Code Online (Sandbox Code Playgroud)\n\n但是使用这段代码,我无法获得我想要的外键值。
\n\n谢谢
\nvalues()为您提供了一个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)