【发布时间】:2023-03-27 17:22:01
【问题描述】:
使用 Django ORM,可以做类似queryset.objects.annotate(Count('queryset_objects', gte=VALUE)) 的事情。赶上我的漂移?
这里有一个简单的例子来说明一个可能的答案:
在 Django 网站中,内容创建者提交文章,普通用户查看(即阅读)所述文章。文章既可以发表(即可供所有人阅读),也可以以草稿模式发表。描述这些要求的模型是:
class Article(models.Model):
author = models.ForeignKey(User)
published = models.BooleanField(default=False)
class Readership(models.Model):
reader = models.ForeignKey(User)
which_article = models.ForeignKey(Article)
what_time = models.DateTimeField(auto_now_add=True)
我的问题是:我怎样才能获得所有已发表的文章,按过去 30 分钟内的独特读者群排序? IE。我想计算每篇已发表文章在过去半小时内获得了多少不同(唯一)浏览量,然后生成按这些不同浏览量排序的文章列表。
我试过了:
date = datetime.now()-timedelta(minutes=30)
articles = Article.objects.filter(published=True).extra(select = {
"views" : """
SELECT COUNT(*)
FROM myapp_readership
JOIN myapp_article on myapp_readership.which_article_id = myapp_article.id
WHERE myapp_readership.reader_id = myapp_user.id
AND myapp_readership.what_time > %s """ % date,
}).order_by("-views")
这引发了错误:“01”或附近的语法错误(其中“01”是额外内部的日期时间对象)。没什么可继续的。
【问题讨论】:
-
with
unique view是否意味着同一读者的多次浏览都算作一次? -
没错,多次浏览,但同一个人的浏览,算作一次。我认为这里需要使用 distinct()。
-
看看这是否为您提供了每篇文章的唯一查看次数,然后您将过滤/排序/限制它们
Article.objects.values('readership__reader').annotate(numviews=Count('readership')) -
是的,我也做到了这一点,但是当我尝试让“在最后 30 分钟内”工作时,一切都消失了。
-
尝试
Article.objects.values('readership__reader').annotate(numviews=Count('readership')).filter(readership__what_time__lt=threshold),其中threshold = datetime.datetime.now() - timedelta(minutes=30)
标签: python django django-queryset