【问题标题】:Cannot filter my Django model depence on created_date无法过滤我对 created_at 的 Django 模型依赖
【发布时间】:2021-02-02 05:03:35
【问题描述】:

我正在尝试制作图表。我的数据库已创建日期。我每天大约 150 次获取产品数据,我希望看到我的数据每天增加和减少。我的前端和 Django 模板没有问题(我尝试手动数据,效果很好)我只想看看最近 7 天的图表。

当我使用Products.objects.filter(created_dates=days) 过滤方法时,我得到了空的查询集。

我已经尝试created_dates__gte=startdate,created_dates__lte=enddate 它返回空查询集。

我也尝试created_dates__range也没有答案。

我只是从created_dates__gte=days 获取数据,但我不想要这些数据。

view.py

from datetime import date,timedelta

import datetime

def data_chart(request):
   data = []
   week_days = [datetime.datetime.now().date()-timedelta(days=i) for i in range (1,7)]
   for days in week_days:
      product_num = Products.objects.filter(created_dates=days)
      date =days.strftime("%d.%m")
      item = {"day": date,"value":len(product_num)}
      data.append(item)
   return render(request, 'chartpage.html', {'data': data})

在我的数据库中,我有数千条数据,我每天的数据大约有 150 条。我的 created_dates 列格式是这样的。

created_dates col: 2020-10-19 09:39:19.894184

那么我的代码有什么问题?你能帮忙吗?

【问题讨论】:

  • 也显示您的模型。 created_dates 是 DateTimeField 吗?
  • 我的模型像这样 created_dates = models.DateTimeField(auto_now_add=True,verbose_name = ("Oluşturma Tarihi"),null=True)

标签: python django datetime


【解决方案1】:

您应该能够使用单个聚合查询来做到这一点:

import datetime
from django.db.models import Count


def data_chart(request):
    cutoff = datetime.date.today() - datetime.timedelta(days=7)
    raw_data = (
        Products.objects.filter(created_dates__gte=cutoff)
        .values_list("created_dates__date")
        .annotate(count=Count("id"))
        .values_list("created_dates__date", "count")
    )
    data = [{"day": str(date), "value": value} for (date, value) in raw_data]
    return render(request, "chartpage.html", {"data": data})

【讨论】:

  • 我会尽力让你知道一天的结束
  • 我不知道如何,但它运作良好。图表准备得很好。但是你写的日期和计数是错误的。它应该是“day”:str(day),“value”:value,因为它作为 datetime 类返回,所以我使用 str(day)。非常感谢。
  • @MuratDemir 啊,是的。修正了错字:)
【解决方案2】:

您正在尝试将 DateTimeField 类型 (created_dates) 与 Date 类型 (week_days 是天数列表) 进行比较,所以也许您应该尝试 __date 查找。

product_num = Products.objects.filter(created_dates__date=days)

https://docs.djangoproject.com/en/3.0/ref/models/querysets/#date

此外,也许您应该考虑开始将 Count() 数据库函数与 group by 一起使用,而不是迭代数天。

这里有很好的解释: https://stackoverflow.com/a/19102493/5160341

【讨论】:

  • 再次这样返回 所以还没有解决办法
猜你喜欢
  • 1970-01-01
  • 2021-10-29
  • 2012-03-23
  • 2018-01-31
  • 1970-01-01
  • 2014-07-02
  • 2013-03-16
  • 2020-07-02
相关资源
最近更新 更多