Django 按日期计数排序

Django order by count by date

早上好!

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

这是我的模型:

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]

感谢您的帮助!

这里有两个问题:(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=<strong>Q(votedate__date__date=now().date())</strong>)
).order_by(<strong>'-count'</strong>)[:30]

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

中进行过滤
class VoteDate(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    date = models.DateTimeField(<strong>auto_now_add=True, db_index=True</strong>)

我们可以过滤:

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

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

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