Django-过滤模型按日期和用户,然后是总字段

时间:2017-01-24 15:13:49

标签: django date django-models filter django-views

我要做的是获取已创建的模型,比如说是1/1 / 17-1 / 31/17,然后总共返回所有模型的FloatField。有了这个总数,我想在标有1月的条形图上填充一列。然后在二月做同样的事......等等。

这是我的模特:

class Punch(models.Model):
    flag = models.FloatField(max_length=10)
    actual = models.FloatField(max_length=10, blank=True, null=True)
    description = models.CharField(max_length=100, blank=True)
    user = models.ForeignKey(User)
    date = models.DateTimeField(auto_now_add=True)

我想按用户和日期范围进行过滤,因此在我的观看中,我有类似的内容:

        punch = Punch.objects.filter(date__range=[2017-01-01,2017-01-31])
        user = request.user
        punches = punch.filter(user=user)
        context = {'punches': punches}

因此,在整个月中,用户填写表格,在表格字段中输入金额,然后保存Punch对象。我想获得在月份的旗帜字段中输入的总金额。这是我迷路了。我假设我需要在对象中运行for循环,但我不确定如何完成此操作。此外,是否应该在模板或我的视图中出现?任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

您无需迭代查询集以获取flag的总和,您需要使用的内容称为聚合,特别是我们正在查看sumhttps://docs.djangoproject.com/en/1.10/topics/db/aggregation/#cheat-sheet

所以这是你需要的代码:

user = request.user
punches = Punch.objects.filter(date__range=["2017-01-01","2017-01-31"], user=user)
flag_sum = punches.aggregate(flag_sum=Sum('flag'))["flag_sum"]

我们正在做的是在我们的查询集sum中询问所有flag值的punches,因为我们正在调用aggregate参数{{1} },它将输出flag_sum,因此我们使用{"flag_sum":123.456}直接访问它,这将返回您正在寻找的浮点值。