繁体   English   中英

QuerySet 类型的对象不是 JSON 可序列化的

[英]Object of type QuerySet is not JSON serializable

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

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

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}]>

对我来说看起来不错,有一个列表列表,列表有一个名称“squats”,然后是值。 但是再次出现此错误“'QuerySet' 对象不可调用”

如果您知道要传递给 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))

尽管可以预料, DjangoJSONEncoder不处理查询集或模型实例(有关DjangoJSONEncoder处理的类型, 请参见此处)-这部分实际上由序列化程序本身处理,但序列化程序需要一个Queryset而不是查询集的字典。

IOW,您必须编写自己的编码器(基于DjangoJSONEncoder )来处理查询集和模型(提示: someobj.__dict__将对象的属性作为 dict 返回,您可以过滤掉它以删除不相关的 django 内容,例如_state

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM