Фильтр 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"]