【问题标题】:If date not in queryset add default value如果日期不在查询集中添加默认值
【发布时间】:2020-11-03 08:50:07
【问题描述】:

我正在将 django 与 chartjs 集成。我使用如下所示的基于类的视图。

class SingleTagChartJSONView(BaseLineOptionsChartView):

    def get_context_data(self, **kwargs):
        context = super(BaseLineChartView, self).get_context_data(**kwargs)

        date_year = int(str(context["year"]))
        date_month = int(str(context["month"]))

        specific_date = datetime(date_year, date_month, 1)
        obj_tags = mitop_tags.objects.filter(
                tag_publish_date__year=specific_date.year,
                tag_publish_date__month=specific_date.month,
                post_tag_single=str(context['tag'])).extra(
                      {'day' : "date(tag_publish_date)"}
                    ).values('day').annotate(
                        tag_occur=Count('post_tag_single'))

我得到这样的 obj_tags 输出:

{'day': datetime.date(2020, 10, 16), 'tag_occur': 3}
{'day': datetime.date(2020, 10, 17), 'tag_occur': 3}
{'day': datetime.date(2020, 10, 18), 'tag_occur': 1}
{'day': datetime.date(2020, 10, 19), 'tag_occur': 2}
{'day': datetime.date(2020, 10, 20), 'tag_occur': 1}
{'day': datetime.date(2020, 10, 22), 'tag_occur': 6}
{'day': datetime.date(2020, 10, 23), 'tag_occur': 8}
{'day': datetime.date(2020, 10, 24), 'tag_occur': 8}
{'day': datetime.date(2020, 10, 26), 'tag_occur': 8}
{'day': datetime.date(2020, 10, 27), 'tag_occur': 6}
{'day': datetime.date(2020, 10, 28), 'tag_occur': 6}
{'day': datetime.date(2020, 10, 30), 'tag_occur': 3}
{'day': datetime.date(2020, 10, 31), 'tag_occur': 7}

我想为查询集中不存在的日期(记录)添加默认值。

{'day': datetime.date(2020, 10, 1), 'tag_occur': 0}

在这种情况下,从 1-15 然后缺少 25 和 29。 期望的输出

{'day': datetime.date(2020, 10, 1), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 2), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 3), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 4), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 5), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 6), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 7), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 8), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 9), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 10), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 11), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 12), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 13), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 14), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 15), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 16), 'tag_occur': 3}
{'day': datetime.date(2020, 10, 17), 'tag_occur': 3}
{'day': datetime.date(2020, 10, 18), 'tag_occur': 1}
{'day': datetime.date(2020, 10, 19), 'tag_occur': 2}
{'day': datetime.date(2020, 10, 20), 'tag_occur': 1}
{'day': datetime.date(2020, 10, 22), 'tag_occur': 6}
{'day': datetime.date(2020, 10, 23), 'tag_occur': 8}
{'day': datetime.date(2020, 10, 24), 'tag_occur': 8}
{'day': datetime.date(2020, 10, 25), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 26), 'tag_occur': 8}
{'day': datetime.date(2020, 10, 27), 'tag_occur': 6}
{'day': datetime.date(2020, 10, 28), 'tag_occur': 6}
{'day': datetime.date(2020, 10, 29), 'tag_occur': 0}
{'day': datetime.date(2020, 10, 30), 'tag_occur': 3}
{'day': datetime.date(2020, 10, 31), 'tag_occur': 7}

该输出应按日期排序。 最后输出到 chartjs 数据集

在此处预览实际问题: https://consuming-olm-0670.dataplicity.io/mi_top/statistic/tag/f1/10/2020

【问题讨论】:

    标签: python django date chart.js django-queryset


    【解决方案1】:

    假设您的查询集如下所示:

    obj_tags = [
        {'day': datetime.date(2020, 10, 1), 'tag_occur': 4},
        ...
        {'day': datetime.date(2020, 10, 22), 'tag_occur': 31},
    ]
    

    你可以创建一个空的dict列表,并在里面添加queryset的数据:

    import datetime
    
    d1 = datetime.date(2020, 10, 1)
    d2 = datetime.date(2020, 10, 31)
    all_empty_tags = [{'day':d1 + datetime.timedelta(days=x), 'tag_occur': 0} for x in range((d2-d1).days + 1)]
    
    for key, value in enumerate(all_empty_tags):
        try:
            new_tag_occur = [item['tag_occur'] for item in obj_tags if item["day"] == value["day"]][0]
            dd[key]['tag_occur'] = new_tag_occur
        except IndexError:
            pass
    
    

    您将拥有所有数据

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2012-02-18
      • 2020-11-04
      • 2022-08-05
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2022-12-15
      相关资源
      最近更新 更多