【问题标题】:Object of type QuerySet is not JSON serializableQuerySet 类型的对象不是 JSON 可序列化的
【发布时间】:2019-03-14 11:00:54
【问题描述】:

我有这些可以按名称调用的列表对象。它们具有用户可以输入的数值。我将如何将每个列表转换为 js 可以呈现的图表?我试过这个:Django Queryset to dict for use in json 但无法让它工作。获取“QuerySet 类型的对象不是 JSON 可序列化的”。 Chart js 需要为每个列表有自己的行并显示这些行中的值。这是我使用 views 中的链接所取得的进展:

首先我得到所有用户列表:

user_lists = List.objects.filter(user=user)

然后我得到每个列表的数值

list_data = {}
for list in user_lists:
    list_data[list.name] = DataItem.objects.filter(list=list)

当我应该将这些列表转换为 chart.js 可以理解的内容时,我遇到了困难..

list_data_json = json.dumps(list_data, cls=DjangoJSONEncoder)

顺便说一句,我是否在正确的轨道上将此转换为视图,对吗?还是属于其他地方?

不知道是否需要这些,但这里是这些列表和其中数据项的模型

class List(models.Model):
    name = models.CharField(max_length=100, default="")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='lists')

def __str__(self):
    return self.name

class Meta:
    unique_together = ['name', 'user']


class DataItem(models.Model):
    data = models.IntegerField(default=0)
    list = models.ForeignKey(List, on_delete=models.CASCADE, related_name='data_items')

编辑 输出查询集看起来像这样(这是 json.dumps 试图读取的问题):

<QuerySet [{'name': 'squat', 'data_items__data': 1}, {'name': 'deadlift', 'data_items__data': 55}, {'name': 'Chest', 'data_items__data': None}, {'name': 'asd', 'data_items__data': 444}, {'name': 'asd', 'data_items__data': 32342}, {'name': 'asd', 'data_items__data': 42342}]>

对我来说看起来不错,有一个列表列表,列表有一个名称“蹲”,然后是值。但再次出现此错误“'QuerySet' object is not callable”

【问题讨论】:

    标签: django


    【解决方案1】:

    如果您知道要传递给chart.js 的字段,则可以执行特定的values() 查询以获取字典,您可以使用json.dumps 轻松对其进行序列化,或多或少像这样:

    user_lists = (List.objects
        .filter(user=user)
        .select_related('user')
        .prefetch_related('data_items')
        .values('user__username', 'data_items__data')  # all fields you need
    )
    
    list_data_json = json.dumps(list(user_lists))
    

    【讨论】:

    • 呃!早该想到的(捂脸)。
    • 我收到错误“'List' object is not callable”@Endre Both
    • 解决办法是not far off...
    • 已编辑帖子! @brunodesthuilliers
    【解决方案2】:

    尽管可以预期,DjangoJSONEncoder 不处理查询集或模型实例(see here 用于 DjangoJSONEncoder 处理的类型) - 这部分实际上由序列化程序本身处理,但序列化程序需要一个 @ 987654325@ 而不是查询集的字典。

    IOW,您将不得不 write your own encoder(基于 DjangoJSONEncoder)来处理查询集和模型(提示:someobj.__dict__ 将对象的属性作为字典返回,您可以过滤掉它以删除不相关的 django 内容,例如 @ 987654328@)

    【讨论】:

    • 我对 javascript 的了解为零,只使用因为需要这些图表.. 可以使用序列化程序分别处理每个查询集吗?如果可能怎么办? @bruno desthuilliers
    • 这实际上与Javascript无关(json不是javascript,它是基于js语法的文本格式)。并且您不能单独对查询集进行 jsonify,将它们放在 dict 中并 jsonify 整个 dict,因为查询集将被双重编码(因此结果将不是有效的 json)。我描述的解决方案 - 真的 实际上很容易设置)是一个正确的解决方案。
    • 或者实际上只是使用 Endre Both 的解决方案,它更简单、更智能 xD
    • 好吧,我是 jsons 和其他东西的新手,所以我不知道:D
    猜你喜欢
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2021-07-04
    • 2021-12-10
    • 1970-01-01
    • 2021-09-27
    • 2019-09-04
    相关资源
    最近更新 更多