Не удалось превратить набор запросов в JSON с моделью many2many - PullRequest
0 голосов
/ 24 июня 2019

Я хочу сериализовать простой набор запросов, но мне не удается. У меня есть модель, которая имеет отношение многие ко многим, и я хочу отобразить только некоторые поля.

Мои модели:

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 Ответ

1 голос
/ 24 июня 2019

У меня пока недостаточно репутации, чтобы комментировать.Поэтому автономный ответ для одной строки кода.

Теперь, чтобы получить отфильтрованные объекты в JSON, используйте list(object.values()) вместо передачи аргументов-значений.

Я предполагаю, bg - это набор запросовполученный после фильтрации через объекты, которые вы проходили через контекст.

data = list(bg.values())

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

Эти отфильтрованные данные теперь содержат нужную вам информацию JSON.

Теперь вы можете передать этот список через ответ JSON

from django.http import JsonResponse

return JsonResponse(filtered_data, safe=False)
...