Django 按日期按计数排序

Posted

技术标签:

【中文标题】Django 按日期按计数排序【英文标题】:Django order by count by date 【发布时间】:2021-12-31 23:19:47 【问题描述】:

早上好!

我尝试了很多方法,但无法按喜欢和日期订购我的帖子。例如,我希望有一个“热门帖子”页面,其中仅包含今天的帖子,但按最喜欢的排序。

这是我的模型:

Class Post(models.Model):
    name = models.CharField(max_length=40, default=None, null=False)
    cover = models.CharField(max_length=100, default=None, null=True, blank=True)
    content = models.TextField(max_length=2000, default=None, null=False)

class VoteDate(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    date = models.DateTimeField(default=timezone.now)

我最接近但没有工作的是这一行:

hot_today = Post.objects.annotate(count=Count('votedate', filter=Q(votedate__date=datetime.today()))).order_by('count')[:30]

感谢您的帮助!

【问题讨论】:

字段名称前加-,从高到低排序:order_by('-count') 【参考方案1】:

这里有两个问题:(1)您通过VoteDate 对象的date 字段进行过滤,这是一个DateTime,因此过滤将无法正常工作,因为您将日期时间对象与日期时间,小时、分钟和秒都设置为零; (2) 你应该按降序排列,所以-count,而不是count

from django.db.models import Q
from django.utils.timezone import now

hot_today = Post.objects.annotate(
    count=Count('votedate', filter=Q(votedate__date__date=now().date()))
).order_by('-count')[:30]

您可能希望在date 字段上添加数据库索引以提高效率,并在QuerySet 中进行过滤:

class VoteDate(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    date = models.DateTimeField(auto_now_add=True, db_index=True)

我们可以过滤:

from django.db.models import Q
from django.utils.timezone import now

hot_today = Post.objects.filter(
    votedate__date__date=now().date()
).annotate(
    count=Count('votedate')
).order_by('-count')[:30]

这不会显示当天没有投票的Posts,但这可能不是问题。通过过滤,将有效减少查询时间,仅设置为今天的VoteDates。

【讨论】:

以上是关于Django 按日期按计数排序的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb:按元素分组并根据条件显示子文档计数并按日期对文档进行排序

Laravel:orderBy喜欢计数

数据框:如何在 Scala 中分组/计数然后按计数排序

Cassandra 按计数排序结果

Sequelize - 按关联计数排序

如何按日期排序数组并计算离子2