首页 > 解决方案 > 从序列化程序响应中删除 field==0 的结果

问题描述

我使用 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)

标签: djangodjango-rest-framework

解决方案


您正在序列化程序中生成字段,然后想要丢弃该对象。事情不是这样工作的:序列化器只是改变数据的表示。显示哪些数据在视图中确定。

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")

推荐阅读