Используя 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 минут? То есть Я хочу подсчитать, сколько различных (уникальных) представлений каждая опубликованная статья попала за последние полчаса, а затем составить список статей, отсортированных по этим различным представлениям.
Я пробовал:
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" был объектом datetime внутри дополнительно). Это не так много.