Задать вопрос
@Elvinchik

Как превратить QuerySet в JSON?

есть такой код:
def post(self, request):
        fields = ["en_mm", "height", "diametr", "season", "cartype"]
        qs = TireModel.objects.all()
        for field in fields:
            if request.POST.get(field) != "" and request.POST.get(field) != "All":
                qs = qs.filter(**{field: request.POST.get(field)})

        print(qs) # Выводит <QuerySet []>
        
        return JsonResponse({"data": "1"}, status=200)


Как сделать из qs JSON?
  • Вопрос задан
  • 891 просмотр
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
@DoomAndGloom
1. На самом деле тебе нужен не JSON, а словарь. Не стоит путать эти штуки :) JSON -- это строка, отформатированная в таком виде, что она очень похожа на питоновский словарь. Он используется не только в Python, а много где ещё.

2. Если хочется найти ответ, то для гуглежа пригодится слово "сериализация" (eng. "serialize"), это примерно то, что тебе нужно.

Обычно для этого используют DRF, вот туториал по сериализации в нём

Результат будет примерно такой:

from rest_framework import serializers

class TireSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tire
        fields = ["en_mm", "height", "diametr", "season", "cartype"]

def post(self, request):
    fields = ["en_mm", "height", "diametr", "season", "cartype"]
    qs = TireModel.objects.all()
    for field in fields:
        if request.POST.get(field) != "" and request.POST.get(field) != "All":
            qs = qs.filter(**{field: request.POST.get(field)})
    serializer = TireSerializer(qs, many=True)
    print(serializer.data)


3. Если смущает, что выводит <QuerySet []>, то дело в заполненности БД: попросту не нашлось ни одного Tire, чтобы он соответствовал всем применённым фильтрам.

4. Можно обойтись без DRF, например, вот что предлагает Django из коробки, либо сделать всё просто руками:

from rest_framework import serializers

def serialize_tires(tires):
    return [
        {"en_mm": tire.en_mm,
         "height": tire.height,
         "diametr": tire.diametr,
         "season": tire.season,
         "cartype": tire.cartype} for tire in tires]

def post(self, request):
    fields = ["en_mm", "height", "diametr", "season", "cartype"]
    qs = TireModel.objects.all()
    for field in fields:
        if request.POST.get(field) != "" and request.POST.get(field) != "All":
            qs = qs.filter(**{field: request.POST.get(field)})
    print(serialize_tires(tires))


Такой способ подойдёт, если сериализации в проекте будет не очень много, чтобы не тащить ещё один фреймворк в проект ради пары строк кода. Но если это планируется использовать повсеместно в проекте -- лучше взять DRF.
Ответ написан
solotony
@solotony
покоряю пик Балмера
используй values_list для QuerySet
ну а потом конвертируй результат в JSON
Ответ написан
Комментировать
@trankov
1. import json
2. Получить словарь из queryset
3. json.dumps(словарь)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы