Удалить результаты с полем == 0 из ответа сериализатора

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Я использую ModelSerializer для возврата сериализованных данных модели:

 class CategorySerializer(serializers.ModelSerializer):
    category_count = serializers.SerializerMethodField('_category_count')

    def _category_count(self, obj):
        category_obj = Category.objects.get(id=obj.id)
        questions_count = Question.objects.filter(category=category_obj).count()
        return questions_count

    class Meta:
        model = Category
        fields = ["id", "category", "category_count"]
  

То, что я получаю сейчас, находится здесь:

  [{
        "category": "orzecznictwo lekarskie",
        "category_count": 0,
        "id": 9
    },
    {
        "category": "zdrowie publiczne",
        "category_count": 1,
        "id": 10
    }
]
  

Я хочу удалить объекты с category_count == 0 из сериализации

 [
        {
            "category": "zdrowie publiczne",
            "category_count": 1,
            "id": 10
        }
    ]
  

Спасибо за вашу помощь.

Редактировать:

 class Question(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    question = models.TextField(blank=True, null=True)
    (...)



 class Category(models.Model):
    category = models.TextField()
    category_slug = models.CharField(max_length=50)
  

Комментарии:

1. покажите нам модели LepAppPytanie и LepAppDzial

2. Пожалуйста, переведите названия полей и моделей на английский, это очень трудно читать для тех, кто не знает румынский.

3. @Melv Я перевел поля на английский

4. @iklinac Я добавил модели LepAppPytanie (Вопрос) и LepAppDzial (категория)

Ответ №1:

Вы генерируете поле внутри сериализатора, а затем хотите удалить объект. Это не так, как все работает: сериализаторы просто меняют представление данных. Какие данные отображаются, определяется в представлениях.

 class CategoryListView(generics.ListAPIView):
    def get_queryset(self):
        return models.Category.objects.annotate(
            question_count=Count("question_set")
        ).exclude(question_count=0)
  

И в сериализаторе вам больше не нужно создавать счетчик и добавлять ‘question_count’ Meta.fields .

Рекомендуемое чтение.

Редактировать:

Забыл, что DRF проверит поле в модели и завершится ошибкой, поэтому вам нужно объявить поле:

 class CategoryWithQuestionCount(serializers.ModelSerializer):
    question_count = serializers.IntegerField(read_only=True)

    class Meta:
        model = models.Category
        fields = ("pk", "category", "question_count")
  

Ответ №2:

Я не уверен, стоит ли удалять его в ModelSerializer. Но вы можете попробовать переопределить get_queryset() или изменить набор запросов в вашем представлении:

 queryset = Class.objects.exclude(dzial_liczba_pytan=0)
  

Комментарии:

1. Это не сработает, потому что это сгенерированное поле сериализатора, а не поле модели.

2. @Melvyn Данные, которые он получит, будут из набора представлений нет? тогда не проще ли просто исключить данные из набора представлений?

3. Вы можете включать записи только в представление, а не в сериализатор, но опять же — dzial_liczba_pytan не является полем модели, поэтому вы не можете фильтровать по нему.

4. о, да, это правда, моя ошибка.