【问题标题】:Django: grouping and counting by dayDjango:按天分组和计数
【发布时间】:2013-10-06 22:18:49
【问题描述】:

我需要按日期对项目进行分组和计数。我在 sqlite 上得到了以下内容:

Books.objects.filter(state="new").extra({"published_at": "date(published_at)"}).values("published_at").annotate(counter=Count("pk"))

但是extra() 和sql 语句的使用不能在其他dbms 上移植。例如上面的不适用于mysql。 如何对 sqlite、postgresql 和 mysql 进行有效查询?

【问题讨论】:

  • 你是如何按日期计算的。看来您是按 pk 计数的,它始终为 1。另外,您为什么需要 "date(published_at)"。 Django 的Datetime 字段已经提供了一个日期时间对象,因此无需再次转换为日期。
  • 因为 published_at 是一个时间戳,我需要按天计算图书。

标签: mysql django sqlite postgresql


【解决方案1】:

如果你想要一个与数据库无关的查询,不要使用 extra()。 书籍 = Books.objects.filter(state="new") .order_by('published_at', ) .values("published_at", ) .annotate(count=Count("published_at__day"))

访问 date__day (published_at__day) 失败:

FieldError:不允许加入字段“日期”。你拼错了'day'吗 查找类型?

如果将Django annotate groupings by month 改写为按天分组。

Book.objects.all().extra(select={'day': 'extract( day from date )'}).values('day').annotate(num=Count('date')).order_by()

您可能希望将 .all() 替换为 .filter(year=some_year),因为这将跨越多年。

Extract 已确认可在 MySQL 和 PostgreSQL 上运行。

【讨论】:

  • 更新了我的答案。但我仍然不确定我是否完全理解要达到的目标。请详细说明。
  • SQLite .extra({"published_at": "date(published_at)"}) 做什么?将字符串转换为日期?
  • 是的,它转换为日期。正如我所说,我需要每天出版书籍的计数器
  • 此代码出现以下错误:不允许加入字段“published_at”。您是否将查找类型的“day”拼错了?
猜你喜欢
  • 1970-01-01
  • 2012-05-10
  • 2012-04-26
  • 2020-08-19
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多