Фильтрация Django для получения популярных сообщений

У меня есть две разные модели. Модель HitCount хранит IP адреса, чьи посты были просмотрены. И что я хочу, это отфильтровать популярные 3 поста, которые просмотрели больше. Я пробовал несколько запросов, но не смог. Я делюсь с вами своими моделями.

class Post(ModelMeta, models.Model):

    title = models.CharField(max_length=255, verbose_name='Başlık', unique=True)
    slug = models.SlugField(max_length=255, unique=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='blog_posts', verbose_name="Yazarı")
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='blog_posts',
                                 verbose_name="Kategorisi", null=True)
    tags = models.ManyToManyField(Tag, related_name='blog_posts', verbose_name='Etiketler')
    image = models.ImageField(verbose_name='Fotoğraf (800x460)')
    content = RichTextField()
    description = models.TextField(null=True)
    status = models.IntegerField(choices=STATUS, default=0, verbose_name='Yayın Durumu')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='Oluşturulma Tarihi')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='Güncellenme Tarihi')
    
    @property
    def get_hit_count(self):
        return HitCount.objects.filter(post=self).count()

class HitCount(models.Model):

    ip_address = models.GenericIPAddressField()
    post = models.ForeignKey("Post", on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.ip_address} => {self.post.title}'

Вы можете попробовать что-то вроде этого :

most_viewed_posts = Post.objects.all().order_by('-get_hit_count')[3]

Я не думаю, что вы можете упорядочить по 'get_hit_count', но я думаю, что эти вопросы могут вам помочь: Django order_by a property

Использование свойства метода пользовательской модели Django в order_by()

Я сделал то, что хотел, используя метод сортировки. Спасибо Александру Букарду за ресурсы.

Решение; sorted(Post.objects.filter(status=1), key=lambda a: a.get_hit_count, reverse=True)

reverse=False по умолчанию и сортирует по возрастанию, в данном случае я хочу получить обратную сортировку, поэтому я использовал reverse=True

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