Как отсортировать объекты по функции внутри модели? Django

В моей модели Product у меня есть функция total_thumbs_up, которая подсчитывает, сколько пользователей поставили большой палец вверх за этот продукт.

class Product(models.Model):
    class ProductObjects(models.Manager):
        def get_queryset(self):
            return super().get_queryset().filter(status='published')
    objects = models.Manager()

    thumbs_up = models.ManyToManyField(
        settings.AUTH_USER_MODEL, related_name="product_thumbs", blank=True)

    def total_thumbs_up(self):
        return self.thumbs_up.count()

В моем файле views у меня есть два таких класса. Мне нужно получить отсортированные продукты по количеству thumbs_up, но эта строка ('-thumbs_up', '0'), не работает. Мне нужно иметь что-то вроде ('-total_thumbs_up', '0'),. Как я могу это установить?

class ProductFilter(django_filters.FilterSet):
    order_by_field = 'ordering'
    ordering = OrderingFilter(
        fields=(
            ('-thumbs_up', '0'),
            ('price', '1'),
            ('-price', '2'),
            ('id', '3'),
            ('-published', '4'),
        )
    )


class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = [IsAuthenticatedOrReadOnly]
    pagination_class = Pagination
    filter_backends = [DjangoFilterBackend,
                       filters.OrderingFilter, filters.SearchFilter]
    parser_classes = [MultipartJsonParser, parsers.JSONParser]
    search_fields = ['name']

    filter_class = ProductFilter
    ...

Что-то вроде:

from django.db.models import Count

ordered_products = Product.objects.all().annotate(
    thumbs_count = Count('thumbs_up')
).order_by('-thumbs_count')

Обратите внимание, аннотированное имя thumbs_count должно отличаться от модели, имя метода которой total_thumbs_up.

Вернуться на верх