Сортировать товары по рейтингу высокий-низкий-низкий-высокий

Я пытаюсь настроить так, чтобы мои продукты на сайте продуктов можно было сортировать по рейтингу высокий-низкий и низкий-высокий и показывать за ними продукты без рейтинга. Я не могу разобраться с этим, поэтому любая помощь будет принята с благодарностью. Я добавил код, который, как я думаю, необходим, если вам нужно что-то еще, я добавлю это. Заранее спасибо.

current look high-low

Я хочу, чтобы при сортировке по высокому и низкому рейтингу первым был отзыв с наивысшим рейтингом, а если у него нет рейтинга, то он переходит в самый конец за теми, у которых есть рейтинг.

current look low-high

Я хочу, чтобы сначала шли самые низкорейтинговые, а затем нерейтинговые, а после них рейтинговые.

views.py

models.py

from django.db import models
from django.contrib.auth.models import User


class Category(models.Model):

    class Meta:
        verbose_name_plural = 'Categories'

    name = models.CharField(max_length=254)
    friendly_name = models.CharField(max_length=254, null=True, blank=True)

    def __str__(self):
        return self.name

    def get_friendly_name(self):
        return self.friendly_name


class Product(models.Model):
    category = models.ForeignKey('Category', null=True, blank=True, on_delete=models.SET_NULL)
    sku = models.CharField(max_length=254, null=True, blank=True)
    name = models.CharField(max_length=254)
    description = models.TextField()
    price = models.DecimalField(max_digits=6, decimal_places=2)
    rating = models.DecimalField(max_digits=6, decimal_places=2, null=True, blank=True)
    image_url = models.URLField(max_length=1024, null=True, blank=True)
    image = models.ImageField(null=True, blank=True)

    def __str__(self):
        return self.name

    def get_rating(self):
        reviews_total = 0

        for review in self.reviews.all():
            reviews_total += review.rating

        if reviews_total > 0:
            return reviews_total / self.reviews.count()

        return 0


class Review(models.Model):
    product = models.ForeignKey(Product, related_name='reviews', on_delete=models.CASCADE)
    content = models.TextField()
    created_by = models.ForeignKey(User, related_name='reviews', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    RATINGS = ((1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5'))
    rating = models.IntegerField(default=RATINGS[2], choices=RATINGS)

    def __str__(self):
        return '%s - %s' % (self.product.name, self.created_by)

products.html template

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