我想序列化一个简单的查询集,但是失败了。我有一个具有多对多关系的模型,我只想显示一些字段。
我的模特:
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。...
答案 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]