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

时间:2019-03-14 11:00:54

标签: django

我有这些可按名称调用的列表对象。它们具有用户可以输入的数字值。我将如何将这些列表中的每一个转化为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'对象不可调用”

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

尽管可能会发生什么,DjangoJSONEncoder既不处理查询集也不建模实例(see here处理DjangoJSONEncoder类型的实例)-这部分实际上是由序列化程序本身处理的,但是序列化程序需要Queryset而不是查询集的字典。

IOW,您将必须write your own encoder(基于DjangoJSONEncoder)来处理查询集和模型(提示:someobj.__dict__将对象的属性作为字典返回,您可以将其过滤为删除无关的django之类的东西,例如_state