Django过滤以获得热门帖子



我有两种不同的型号。HitCount模型存储被查看为Post的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

在order_by((中使用Django自定义模型方法属性

我用sorted方法做了我想要的事情。感谢Alexandre Boucard提供的资源。

解决方案;排序(Post.objects.filter(状态=1(,key=lambda a:a.get_hit_count,reverse=True(

reverse=False作为默认值,它按升序排序。在这种情况下,我想反转,所以我使用了reverse=True

最新更新