Home > Mobile >  drf filter with related table count
drf filter with related table count

Time:01-10

Here is my model:

    class Artwork(models.Model):
        id                = models.BigAutoField(primary_key = True)
        serial            = models.IntegerField(choices=Serial.choices, default=100)
        title             = models.CharField(max_length=255, blank=True, null=True)
        slug              = models.CharField(max_length=255, blank=True, null=True)


    class Views(models.Model):
        id        = models.BigAutoField(primary_key = True)
        user    = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE, related_name="views")
        artwork = models.ForeignKey(Artwork, null=True, blank=True, on_delete=models.CASCADE, related_name="views")

Here is my view

    class GetArtworkLiteView(viewsets.ModelViewSet):
        queryset = Artwork.objects.all()
        serializer_class = GetArtworkLiteSerializer

        filter_backends = [filters.OrderingFilter, DjangoFilterBackend]
        filterset_fields = ['slug']
        ordering_fields = ["id", "serial"]

Here i want to make ordering by count(views) in artwork model. How can i add logic to that so artwork model will sort by count of views i wants to implement this using django rest framework

CodePudding user response:

queryset = Artwork.objects.annotate(count=Count('views')).order_by('-count')

CodePudding user response:

You have to apply the sorting to your view's queryset. The sorting itself should work regardless of using DRF or not.

Change your view class:

    from django.db.models import Count

...

    class GetArtworkLiteView(viewsets.ModelViewSet):
        queryset = Artwork.objects.annotate(count=Count('views_set__id')).order_by('count')
        serializer_class = GetArtworkLiteSerializer

        filter_backends = [filters.OrderingFilter, DjangoFilterBackend]
        filterset_fields = ['slug']
        ordering_fields = ["id", "serial"]
  •  Tags:  
  • Related