【问题标题】:Django- Filter Models by date and user then total fieldsDjango-按日期和用户过滤模型,然后按总字段
【发布时间】:2017-06-09 11:00:12
【问题描述】:

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

这是我的模型:

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 循环,但我不确定如何准确地完成此操作。另外,这应该发生在模板中还是我的视图中?任何帮助表示赞赏!

【问题讨论】:

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


    【解决方案1】:

    你不需要遍历你的查询集来获得flag的总和,你需要使用的是聚合,特别是我们正在查看sum
    https://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"]
    

    我们正在做的是在给定我们的查询集punches 的情况下要求所有flag 值中的sum,因为我们调用aggregate 参数flag_sum,它将输出{"flag_sum":123.456},所以我们使用["flag_sum"] 直接访问它,这将返回您要查找的浮点值。

    【讨论】:

    • 还请注意,您可以为过滤器提供多个参数,因此无需过滤两次;)
    • 谢谢!一个答案中有两个很棒的提示!我会仔细阅读您提供的文档。
    • 我收到此错误:“FloatField”对象在 flag_sum = punches.aggregate 行上没有属性“resolve_expression”。有任何想法吗?谢谢!
    • 没关系,我回家在我的 VE 上试了一下,得到了完整的回溯。我想我可以自己解决这个错误!
    • 我认为您可能可以忽略代码的output_field=FloatField() 部分,我把它放在那里是因为它是文档中给出的示例
    猜你喜欢
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2021-11-26
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2014-03-22
    相关资源
    最近更新 更多