Как отсортировать объекты по функции внутри модели? 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
.