无法使用多对多模型将查询集转换为JSON

时间:2019-06-24 09:32:50

标签: json django serialization django-queryset

我想序列化一个简单的查询集,但是失败了。我有一个具有多对多关系的模型,我只想显示一些字段。

我的模特:

class BuildingGroup(models.Model):
    description           = models.CharField(max_length=500, null=True, blank=True)
    buildings             = models.ManyToManyField(Building, default=None, blank=True)



class Building(models.Model):
    name  = models.CharField(max_length=120, null=True, blank=True)
    year_of_construction = models.IntegerField(null=True, blank=True)

这就是我的看法:


class DetailBuildingGroupView(StaffRequiredMixin, DetailView):
    model = BuildingGroup
    context_object_name = 'group'
    queryset = BuildingGroup.objects.all()

    def get_object(self):
        id = self.kwargs.get("id")
        return get_object_or_404(BuildingGroup, id=id)

    def get_context_data(self, **kwargs):
        context = super(DetailBuildingGroupView, self).get_context_data(**kwargs)
        bg = BuildingGroup.objects.filter(id=self.kwargs.get('id'))

        arr = []
        for item in bg:
            x = item.buildings.values('name', 'net_leased_area')
            arr.append(x)

        context['buildings'] = arr

        return context

这给了我一个像这样的查询集:

[<QuerySet [{'name': 'TestBuilding', 'net_leased_area': 1234.0}, {'name': 'Another test building', 'net_leased_area': 2242.0}, {'name': 'Crazy new item', 'net_leased_area': 12.0}]>]

这几乎是我想要的。但是现在我正在尝试将其转换为JSON格式。

我尝试了多种方式,例如:

data = json.loads(serializers.serialize("json", arr))

或类似

  result = list(bg.values('name', 'net_leased_area'))
        data = (json.dumps(result))

它告诉我查询集不是json可序列化的,或者它没有属性Meta,或者在最后一种情况下,它无法将关键字“名称”解析为字段。 (这很有意义,因为我不再循环浏览了。)

我认为是m2m关系使我感到麻烦。

我以为自己在正确的轨道上,但是我现在不确定。有人可以帮忙吗?首先十分感谢。非常感谢您的帮助。

我认为很奇怪,当返回arr时,它返回一个查询集...

编辑:

这是我的数据的样子:


 {
        "description": "Building Group 1",
        "project": "hb0001",
        "buildings": [
            {
                "name": "TestBuilding",
                "year_of_construction": 1950,
                "net_leased_area": 1234.0,

            },
            {
                "name": "Another test building",
                "year_of_construction": 1234,
                "net_leased_area": 2242.0,

            },
]

编辑2:我可以使用bg = BuildingGroup.objects.filter(id=self.kwargs.get('id')).prefetch_related('buildings')

获得所需的查询集。

但是我仍然无法将查询集转换为JSON。...

1 个答案:

答案 0 :(得分:1)

我还没有足够的声誉来发表评论。因此,这是一行代码的独立答案。

现在要使用JSON获取过滤的对象,请使用showRides (e) { e.preventDefault(); console.log("Here1"); this.props.onclk(true) }; 而不是传递值参数。

我假设list(object.values())是在过滤通过上下文传递的对象之后获得的查询集。

bg

此过滤后的数据现在具有您所需的JSON信息。

现在您可以通过JSON响应传递此列表

data = list(bg.values())

filtered_data = [{'name' : item['name'], 'net_leased_area': item['net_leased_area']} for item in data]