我已经用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 是传递给此函数的查询集
答案 0 :(得分:1)
你还没有发布你的Django模型,所以这里有一个理论上的答案:
要输出基表没有任何条目的数据行,需要将数据与包含每个结果行的条目的另一个数据集对齐(:= join)。
示例:
您的模型表包含以下时间戳记的条目:
如果您想获取所有周的数据,则必须再次加入包含所有周的时间戳的数据集。你怎么创建那种数据集,我不能告诉你。我想在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或尝试使用annotate
和extra
函数来重新创建纯SQL解决方案。