Я хочу сериализовать простой набор запросов, но мне не удается. У меня есть модель, которая имеет отношение многие ко многим, и я хочу отобразить только некоторые поля.
Мои модели:
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 ....