imsaiful
imsaiful

Reputation: 1614

How to add extra key value in django rest framework api view?

This is my models

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)

This is my serializer class

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

This is my views


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

which filter the number and return name and number on following url

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

I am getting following result in my api


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

However my target is also to return the total number of spam reported to the user in my API and final API should look like this

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

Number of spam can be calculated as

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

How should add spam in result queryset

Upvotes: 0

Views: 1394

Answers (1)

JPG
JPG

Reputation: 88499

You can use SerializerMethodField()--[DRF Doc] here as,

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

Upvotes: 1

Related Questions