注释每周值

时间:2017-02-17 11:37:33

标签: mysql django django-orm

我已经用Django queryset API形成了一个声明,它给出了我数据库中某些数据的每周平均值。

返回的数据采用以下格式: (6,4.0),(9,5.0)......等等 其中每个元组中的第一个值表示周数,第二个值表示数据的平均值。

但是,周数不是连续的,只有在那周有数据时才包含。注意第一周是6,第二周是9.我想得到第6周,第7周,第8周,而不是仅返回数据存在的周数。

这是否可以使用Django查询集和注释?

data = post_queryset.annotate(week=WeekFunc('post__start_time')) \
                    .values_list('week') \
                    .annotate(sum=Sum('goods')) \
                    .order_by('week')

Func 类的扩展

class WeekFunc(Func):
    def as_mysql(self, compiler, connection):
        self.function = 'WEEK'
        return super(WeekFunc, self).as_sql(compiler, connection)

post_queryset 是传递给此函数的查询集

1 个答案:

答案 0 :(得分:1)

你还没有发布你的Django模型,所以这里有一个理论上的答案:

要输出基表没有任何条目的数据行,需要将数据与包含每个结果行的条目的另一个数据集对齐(:= join)。

示例:

您的模型表包含以下时间戳记的条目:

  • 第6周
  • 第9周

如果您想获取所有周的数据,则必须再次加入包含所有周的时间戳的数据集。你怎么创建那种数据集,我不能告诉你。我想在MySQL中可能有一些函数或select语句可以做到这一点。

所有几周都加入了模型数据:

- week 1 == <no data> => week 1: sum=0
- week 2 == <no data> => week 2: sum=0
- week 3 == <no data> => week 3: sum=0
- week 4 == <no data> => week 4: sum=0
- week 5 == <no data> => week 5: sum=0
- week 6 == 4 goods   => week 6: sum=4
- week 7 == <no data> => week 7: sum=0
- week 8 == <no data> => week 8: sum=0
- week 9 == 5 goods   => week 9: sum=5

一旦您知道如何创建周列表,就可以将其与模型数据相结合,然后结合SUM()函数的连接应生成所有周内0值的条目你没有数据的地方。

值得坐下来尝试在纯SQL中实现它,以便了解该层上必须发生的事情。只有这样,您才能继续在Django ORM层中创建解决方案 - 通过提供原始SQL或尝试使用annotateextra函数来重新创建纯SQL解决方案。