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]
这不会显示当天没有投票的Post
s,但这可能不是问题。通过过滤,将有效减少查询时间,仅设置为今天的VoteDate
s。
【讨论】:
以上是关于Django 按日期按计数排序的主要内容,如果未能解决你的问题,请参考以下文章