【发布时间】:2019-11-15 03:45:00
【问题描述】:
我正在构建一个基于 django 的应用程序来收集有关某个软件用户的统计信息。
目标是显示一个图表,其中包含每个月使用某个版本的用户数量。
这是模型:
class Installation(models.Model):
userid = models.IntegerField()
version = models.CharField(max_length=25)
timestamp = models.DateTimeField(auto_now=True)
timestamp 是收集用户数据的时间。
示例表如下所示:
| userid | version | timestamp |
|------------------------------|
| 1 | 3.1 |<sometime> |
|------------------------------|
| 2 | 3.1 |<sometime> |
|------------------------------|
| 1 | 3.2 |<sometime> |
|------------------------------|
| 3 | 3.1 |<sometime> |
<sometime> 代表同一个月的不同时间戳。
显示userid = 1在同一个月内升级到3.2版本。
这是我的方法:
version_by_month = Installation.objects
.annotate(month=TruncMonth('timestamp'))
.values('month', 'version')
.annotate(Count('userid', distinct=True))
但它有一个问题,即两个版本都会计算一个用户。例如,对于 3.1 和 3.2 两个版本,它都计算 userid = 1,并将使用 version = 3.1 的用户的计数返回为 3,实际上应该是 2。
我希望每个月都有一个输出,如果用户更改了他的版本,那么只有最新提交的版本应该被计算在内。
上面显示的表的预期查询集应该是这样的:
[{'month': datetime.datetime(2019, 7, 1, 0, 0, tzinfo=<UTC>), 'version': 3.1, 'num': 2},
{'month': datetime.datetime(2019, 7, 1, 0, 0, tzinfo=<UTC>), 'version': 3.2, 'num': 1}]
【问题讨论】:
标签: django postgresql django-models