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
那天没有投票,但这可能不是问题。通过过滤,将有效减少查询时间到今天设置的VoteDate
s。
早上好!
我尝试了很多东西,但无法按喜好和日期订购我的 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
那天没有投票,但这可能不是问题。通过过滤,将有效减少查询时间到今天设置的VoteDate
s。