I have to add an extra field using annotate in the get api. The field is something like count of a field of all the objects, not a particular object. And I want it to appear just once in the response of get api. If I use annotate, it appears on all the objects response. How can it be achieved??
My model:
class Package(models.Model):
location = models.CharField()
bought_times = models.IntegerField(default=0)
/....................../
Now if I use annotate something like this:
qs = Package.objects.filter(....).annotate(whole_bought_counts=Sum("bought_times") or some logic)
In the response it will come like:
{
id = 1,
localtion = Paris,
bought_times = 22,
whole_bought_counts =72,
}
{
id = 1,
localtion = Miami,
bought_times = 16,
whole_bought_counts =72,
}
id = 1,
localtion = Switzerland,
bought_times = 24,
whole_bought_counts =72,
}
I need the whole_bought_counts to appear just to appear once, because the count is used for the dashboard info only. Appearing several times will make it appear 100 times which makes the api quite slow. isnt it??
CodePudding user response:
Additional data can be added to response of a viewset. E.g.
class PackageViewSet(ModelViewSet):
model = Package
serializer_class = PackageSerialzer
queryset = Package.objects.all()
def get_queryset(self):
qs = Package.objects.filter(...) # Whatever you want your qs to be
return qs
def list(self, request):
queryset = self.get_queryset()
serializer = self.serializer_class(queryset, many=True)
addional_data = {
'my_data': ... # Any data, from your queryset or else
}
return Response([addional_data, serializer.data])
