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"]
