【问题标题】:Return all values of QuerySet and serialize into JSON返回 QuerySet 的所有值并序列化为 JSON
【发布时间】:2017-09-04 03:19:18
【问题描述】:

使用此代码,所有值都指定为返回一个 QuerySet

import json

posts = (Post.objects.filter(owner=authenticated_user)
                 .values('id', 'title', 'summary'))
json_posts = json.dumps(list(posts))

有没有办法避免为 QuerySet 指定所有值(“id”、“title”和“summary”)?例如

posts = (Post.objects.filter(owner=authenticated_user)
                 .values(ALL VALUES))

编辑:

最终目标是将 QuerySet 序列化为 JSON。以下代码引发 AttributeError

try:
    obj = SystemOverview.objects.filter(serial=pk).values()
except SystemOverview.DoesNotExist:
    return Response(status=status.HTTP_404_NOT_FOUND)

if request.method == 'GET':
    return Response(serializers.serialize("json", list(obj)))

#ERROR MESSAGE
#AttributeError: 'dict' object has no attribute '_meta'

在不列出所有值的情况下将 Django 对象模型序列化为 JSON 的正确方法是什么?

【问题讨论】:

    标签: python json django serialization django-models


    【解决方案1】:

    如 Django 文档中所述https://docs.djangoproject.com/en/1.10/ref/models/querysets/#values

    values() 方法接受可选的位置参数,*fields, 它指定了 SELECT 应该被限制的字段名称。如果 您指定字段,每个字典将只包含字段 您指定的字段的键/值。 如果您不指定 字段,每个字典将包含每个字段的键和值 在数据库表中

    只需使用Post.objects.filter(owner=authenticated_user).values()

    编辑:

    objs = SystemOverview.objects.filter(serial=pk).values()
    
    if request.method == 'GET':
        return Response(serializers.serialize("json", objs))
    

    【讨论】:

    • 谢谢@rrmerugu。当我使用 values() 而不是 values('id') 时,您是否知道为什么会出现 AttributeError(上面编辑)?
    • 另外,如果你想获取所有的值,为什么还要指定它们呢?为什么不简单地使用obj = SystemOverview.objects.filter(serial=pk)。 (愚蠢的更正使用objs 而不是obj,过滤器将给出对象列表)
    • 您在序列化步骤中创建了一个列表(obj),但实际上您在使用过滤器时已经获得了查询集的列表,这一定是造成错误,请尝试我编辑的答案
    • 问题解决了吗
    猜你喜欢
    • 2020-12-10
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多