【发布时间】:2022-01-13 19:41:03
【问题描述】:
我正在使用 Postgresql。我有模特:
class EventsList(CreatedUpdatedMixin):
start = models.DateTimeField()
end = models.DateTimeField()
is_inner = models.BooleanField()
假设我有这些数据库条目:
| start | end | is_inner |
|---|---|---|
| 2021-12-09 14:30:12 | 2021-12-09 15:00:21 | true |
| 2021-12-09 14:00:05 | 2021-12-10 21:00:15 | false |
| 2021-12-10 09:00:39 | 2021-12-10 09:30:50 | true |
| 2021-12-10 14:00:00 | 2021-12-11 15:00:00 | true |
| 2021-12-14 10:00:00 | 2021-12-14 11:00:00 | true |
| 2021-12-13 13:30:00 | 2021-12-16 14:30:00 | false |
| 2021-12-14 13:10:00 | 2021-12-15 00:30:00 | true |
| 2021-12-14 10:30:00 | 2021-12-16 13:34:00 | false |
| 2021-12-15 13:30:00 | 2021-12-15 18:30:00 | true |
还有我需要的结果:
[
{"2021-12-09": {"external_events": 1, "internal_events": 1}},
{"2021-12-10": {"external_events": 0, "internal_events": 2}},
{"2021-12-11": {"external_events": 0, "internal_events": 1}},
{"2021-12-13": {"external_events": 1, "internal_events": 0}},
{"2021-12-14": {"external_events": 2, "internal_events": 2}},
{"2021-12-15": {"external_events": 2, "internal_events": 2}},
{"2021-12-16": {"external_events": 2, "internal_events": 0}},
]
所以我想获取所有现有日期,并为每个日期获取外部事件的计数(其中 is_inner == False)和内部事件的计数(其中 is_inner == True)。 如何使用 Django ORM 或原始 SQL 来实现? 现在,我想出了
EventsList.objects.annotate(
start_day=Cast("start", output_field=DateField())
).values("start_day").annotate(
external_events=Count("id", filter=Q(is_inner=False)),
internal_events=Count("id", filter=Q(is_inner=True)),
).values(
"start_day", "external_events", "internal_events"
)
此代码返回几乎正确的结果(但仅适用于“开始”日期)。我需要包括所有日期(开始日期、结束日期以及它们之间的所有日期)。将不胜感激。
【问题讨论】:
标签: python sql django postgresql orm