Ответы пользователя по тегу Python
  • Как превратить QuerySet в JSON?

    @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.
    Ответ написан
    2 комментария