【问题标题】:Problems while serializing ValuesQuerySet object to json in django在 django 中将 ValuesQuerySet 对象序列化为 json 时出现问题
【发布时间】:2014-08-14 22:27:14
【问题描述】:

我无法将 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 参数: p>

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    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', ))
    

    【讨论】:

    • 好的,谢谢。使用第一个解决方案,我可以解决问题。但第二个不显示外键值。无论如何谢谢;-)
    • 如何使用第二种方法来显示我的外键值?因为当我尝试这样做时,它们会从我的 json 值中省略?
    猜你喜欢
    • 2011-09-29
    • 2014-06-28
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多