【问题标题】:How to add extra key value in django rest framework api view?如何在 django rest framework api 视图中添加额外的键值?
【发布时间】:2019-06-12 22:44:50
【问题描述】:

这是我的模型

class NumberList(models.Model):
    userId = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    number = models.PositiveIntegerField()
    spam = models.BooleanField(default=False)

    def __str__(self):
        return str(self.number)

这是我的序列化程序类

class FindNameSerializer(serializers.ModelSerializer):
    class Meta:
        model= NumberList
        fields = ('name','number')

这是我的看法


class FindName(ListAPIView):
    print("server error hai")
    serializer_class = FindNameSerializer
    def get_queryset(self, *args, **kwargs):
        number = self.kwargs.get("number")
        queryset = NumberList.objects.filter(number=number)
        return queryset

过滤号码并在以下网址返回名称和号码

path('find/<slug:number>/',FindName.as_view(), name='number'),

我在我的 api 中得到以下结果


[
    {
        "name": "Saiful Hasan",
        "number": 8888888888
    }
]

不过,我的目标也是在我的 API 中返回向用户报告的垃圾邮件总数,最终 API 应如下所示

[
    {
        "name": "Saiful Hasan",
        "number": 8826478938
        "spam": 3
    }
]

垃圾邮件的数量可以计算为

spam=NumberList.objects.filter(spam=True).count()

如何在结果查询集中添加垃圾邮件

【问题讨论】:

    标签: python django django-models django-rest-framework


    【解决方案1】:

    你可以在这里使用SerializerMethodField()--[DRF Doc]

    class FindNameSerializer(serializers.ModelSerializer):
        spam = serializers.SerializerMethodField()
    
        def get_spam(self, instance):
            return NumberList.objects.filter(spam=True, number=self.context['view'].kwargs['number']).count()
    
        class Meta:
            model = NumberList
            fields = ('name', 'number', 'spam')

    【讨论】:

    • 嘿,它过滤掉了所有垃圾邮件,但我想要一个特定数字的过滤器,如 NumberList.objects.filter(Q(spam=True) & Q(number=number)).count()。如何在这里获取号码。我曾尝试使用 kwargs 但无济于事。
    • @imsaiful 我已经更新了答案。您可以在序列化程序中从self.context 获取view 对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 2019-07-07
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2015-11-28
    • 2021-02-26
    相关资源
    最近更新 更多