【问题标题】:Django filter by datetime, after converting string to datetime将字符串转换为日期时间后,Django 按日期时间过滤
【发布时间】:2014-12-13 14:06:58
【问题描述】:

我正在尝试按日期时间过滤我的查询。此日期时间是客户想要了解其信息的值范围的日期时间。我正在尝试将其设置为客户选择的月份的第一天。我通过月份数字将其转换为正确的字符串格式,然后转换为日期时间对象,因为仅查找字符串对象没有返回任何值,并且 Django 的文档说您需要这样做:

pub_date__gte=datetime(2005, 1, 30)

代码:

if 'billing-report' in request.POST:
         customer_id = int(post_data['selected_customer'])

这是我用来获取所选客户日期并将其转换为元组的代码

  if 'billing-report' in request.POST:
     customer_id = int(post_data['selected_customer'])
     selected_date = int(post_data['month'])
     if selected_date < 10:
        selected_date =  '0'+str(selected_date)
     year = datetime.now()
     year = year.year
     query_date =  str(year) + '-' + str(selected_date) +  '-01'

     query_date_filter = datetime.strptime(query_date, "%Y-%m-%d")


     compute_usages = ComputeUsages.objects.filter(customer_id = customer_id).filter(values_date = query_date_filter)


django debug shows: datetime.datetime(2014, 10, 1, 0, 0)
query_date looks like: 2014-07-01  before it is converted

.

没有错误但没有返回数据

我以前用过:

compute_usages = ComputeUsages.objects.filter(customer_id = customer_id).filter(values_date = datetime(query_date_filter))

这是导致错误的原因。很抱歉随着问题的发展而改变了我的问题,这就是为什么我要重新包含我之前所做的事情,以便让 cmets 有意义。

【问题讨论】:

  • datetime(..) 不是元组,例如,len() 不起作用;它是datetime 类的实例,例如由datetime.strptime() 类方法返回。尝试将 datetime 实例传递给 datetime() 会产生“无效整数”错误:TypeError: an integer is required (got type datetime.datetime)
  • 谢谢@J.F.Sebastian 我只是在尝试这种方式,因为以另一种方式传递它是行不通的。我恢复了原来的方式。但是仍然没有返回任何数据。
  • 可能存在多个问题。修复一个,不一定修复所有。不要以这样的方式更改您的问题,以至于@Daniel Roseman 提供的现有答案不再有意义。
  • @J.F.Sebastian 抱歉,我只是想将其更新为最准确的。我道歉
  • 顺便说一句,您不需要将整数转换为字符串,只需将它们转换为日期时间;你可以直接传递整数:datetime(year, month, day)

标签: python django datetime django-views


【解决方案1】:

几乎所有这些代码都与您的问题无关。

我不明白你为什么在query_date 上打电话给datetime。如您所知,这已经是一个日期时间,因为您之前已将其转换为带有strptime 的日期时间。因此,无需再进行任何转换:

ComputeUsages.objects.filter(customer_id=customer_id).filter(values_date=query_date)

【讨论】:

  • 我已经尝试了两种方式,但另一种方式没有返回。但是,如果我取消日期时间过滤器,它会返回所有值,并且如果我在数据库中查看我正在搜索的日期时间的值存在。
【解决方案2】:

在花了一些时间探索将查询过滤器设置为日期时间(年、月、日)之后,我意识到 django 不会将其转换为必须完全匹配的中性日期时间格式。我在数据库中的数据也有年、日、月。

学习点:

您必须准确地使用 datetime() 它在数据库中的样子 django 不会转换为中性格式并进行比较。我认为这就像写一个查询并说 to_date 或 to_timestamp ,其中数据库将采用您的格式并将其转换为中性格式以与数据库的其余部分进行比较。

这是正确的方法

 compute_usages = ComputeUsages.objects.filter(customer_id = customer_id).filter(values_date = datetime(year, day, selected_month))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2017-05-20
    相关资源
    最近更新 更多