【发布时间】:2021-02-16 19:44:02
【问题描述】:
我有一个收集事件的 django 模型。大致是这样的:
class Events(models.Model):
class EventType(models.TextChoices):
OPEN = ...
CLOSE = ...
OTHER = ...
READ = ...
user = models.ForeignKey(User, on_delete=models.CASCADE)
box = models.ForeignKey(Box, on_delete=models.CASCADE)
event_timestamp = models.DateTimeField(default=django.utils.timezone.now)
event_type = models.CharField(max_length=6, choices=EventType.choices)
当用户用盒子做事时会发生事件。
我有四个非常相关的查询要执行,如果不使用 SQL,我完全不确定如何执行此操作,这通常不是 django 的正确解决方案。
- 对于框 B 和用户 U,用户是最近打开还是关闭了此框?
- 对于 Box B,有多少用户处于打开状态?
- 对于框 B,我想绘制每天有多少用户打开,因此我想获得一组每天打开和关闭的用户。
- 我想要一个表格,显示处于打开状态的用户数量。
例如,在 SQL 中,这些将具有类似这样的形式(未经测试的代码,我希望使用 django 的查询语言更容易):
-- 1
SELECT event_type FROM Events
WHERE event_type in ('OPEN', 'CLOSE')
AND user = U
HAVING max(event_timestamp);
-- 2
SELECT count(*) FROM (
SELECT user, event_type FROM Events
WHERE event_type in ('OPEN', 'CLOSE')
GROUP BY user
HAVING max(event_timestamp)
) as T
WHERE event_type = 'OPEN';
-- 3
// A bit complicated any way I slice it due to the
// mapping from datetime to date.
-- 4
SELECT box, count(user) FROM (
SELECT box, user, event_type FROM Events
WHERE event_type in ('OPEN', 'CLOSE')
GROUP BY box, user
HAVING max(event_timestamp)
) as T
WHERE event_type = 'OPEN'
GROUP BY box;
我已经解释了我的四个用例,但我怀疑一旦我理解了其中一个,其他的就会随之而来。显然,我只是没有从文档中摸索出一些东西(我希望如此)。
非常感谢您的任何指点。
【问题讨论】:
-
抱歉,我还以为是一个问题。正如问题末尾所指出的,我认为解决问题的技术可以解决所有问题。 (感谢子查询链接,我错过了(或者在之前的阅读中没有充分吸收它)。)