Фильтр drf с подсчетом связанных таблиц

Вот моя модель:

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

Вот мое мнение

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

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

Здесь я хочу сделать упорядочивание по количеству представлений в модели artwork. Как я могу добавить логику, чтобы модель иллюстрации сортировалась по количеству представлений? Я хочу реализовать это, используя django rest framework

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

Вы должны применить сортировку к набору запросов вашего представления. Сама сортировка должна работать независимо от использования DRF или нет.

Измените класс представления:

    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"]
Вернуться на верх