Key error in serializers while using .values() in django rest

Viewed 216

I want to filter and count the tasks based on their status. Additionally, I also want to add a count of tasks that are due in this week. I tried using .annotate() and .values(), but I am facing key error. Here is my code, as well as the error.

Here is my code: models.py:

class TaskStatus(models.Model):
    status = models.CharField(max_length=200)
    def __str__(self):
        return(self.status)

class Task_category(models.Model):
    job = models.ForeignKey(Job,related_name='Job',on_delete=models.CASCADE, null=True)
    assigner = models.ForeignKey(User,related_name='assigner', on_delete=models.PROTECT, null=True)
    assignee = models.ForeignKey(User,related_name='assignee', on_delete=models.PROTECT, null=True)
    unit = models.ForeignKey(Unit,related_name='UnitName',on_delete=models.CASCADE, null=True)
    equipment = models.ForeignKey(Equipment,related_name='EquipmentName',on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=200)
    category = models.CharField(max_length=200, null=True,blank=True)
    start_date = models.DateField()
    end_date =  models.DateField()   
    created_at = models.DateTimeField(auto_now_add=True,blank=True, null=True)
    updated_at = models.DateTimeField(auto_now=True,blank=True, null=True)
    status = models.ForeignKey(TaskStatus, related_name='Status',on_delete=models.CASCADE) 
    def __str__(self):
        return(self.name)

serializers.py:

class TaskcategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Task_category
        fields = ['id','job','name','category','start_date','end_date','created_at','updated_at','status','assignee', 'unit', 'equipment', 'assigner']
    def to_representation(self, instance):
        rep = super(TaskcategorySerializer, self).to_representation(instance)
        rep['job'] = instance.job.name
        rep['unit'] = instance.unit.name
        rep['equipment'] = instance.equipment.name
        rep['status'] = instance.status.status
        return rep

views.py:

class ChartView(viewsets.ModelViewSet):
    http_method_names = ["get"]
    queryset = Task_category.objects.all()
    serializer_class = TaskcategorySerializer
    def get_queryset(self):
        return Task_category.objects.annotate(value=Count('status')).values('status__status')

Please help. Any sort of help will be appreciated!!

1 Answers

.values() and then .annotate() gives you the functionality of grouping

class ChartView(viewsets.ModelViewSet):
    http_method_names = ["get"]
    queryset = Task_category.objects.all()
    serializer_class = TaskcategorySerializer

    def get_queryset(self):
        return Task_category.objects.values('status__status').annotate(value=Count('status__status')
Related