【问题标题】:How to filter over dates using a string?如何使用字符串过滤日期?
【发布时间】:2012-03-27 16:37:43
【问题描述】:

页面上的数据表可以通过用户输入进行过滤。在 ajax 查询中接收到输入的字符串,我正在尝试按此字符串过滤对象。字符串字段被过滤得很好,但是当我尝试过滤一个日期时:

querySet.filter(datefield__icontains=searchString)

导致 MySQL 异常: 警告:日期时间值不正确:第 1 行的列 '' 的 '%%'

有没有办法使用字符串过滤日期字段?

【问题讨论】:

  • 您找到解决方案了吗?我想做同样的事情,但我不知道如何进行!

标签: python django django-models


【解决方案1】:

您需要create a datetime objects from the string,然后使用该对象进行过滤。您可能希望过滤日期大于或小于 datetime 对象的对象。为此,您可以使用 filter(datefield__gt=datetime_obj)filter(datefield__lt=datetime_obj)

【讨论】:

  • 它可以是任何字符串,很可能我无法从中创建日期时间对象。我想要的是当用户键入“Fe”时,例如,在数据表中应该只有二月份的记录。与数字相同。
  • 这将是非常困难的。想想他们可能输入的所有可能值。 "F" = February、First、Friday 等。在查找日期之前,您需要将字符串提交给服​​务器进行解析,或者使用 javascript 解析字符串,然后使用 ajax 查找日期时间对象
【解决方案2】:

我不确定您希望 icontains 在过滤日期数据时会做什么,因此您可能需要重新考虑或澄清您的期望。

总体而言,您正在尝试根据日期字段进行查询。你有2个选择。您要么需要将字符串转换为日期(或日期时间)对象,要么需要将字符串格式化为“yyyy-mm-dd”。

-- 编辑--

由于您似乎真的在尝试使用字符串来搜索日期,因此在此进行某种澄清。

您想要做的事情将变得非常困难。我会选择不可能的边界。 Django 正在将您的查询转换为 SQL 并查询您的数据库。仅仅因为 ORM 的存在并不能使它能够做 SQL 中不可能做的事情(实际上 ORM 极大地限制了你可以做的事情)。但是,您有多种选择:

  1. 编写 python 来解析字符串并提供日期对象来匹配它们。这可能相当困难。然后,您将需要使用来自 django.db.modelsQ 对象来构造复杂的 OR 查询。当它以任何合理的数量或记录到达数据库时,这可能会很慢。
  2. 弄清楚生成您想要执行的操作的 SQL 会是什么样子。这不会是容易的 IMO,因为有太多的差异,并且数据库中日期的底层表示不会是一个字符串,所以你真的会参与其中。除了手动之外,这基本上是手动执行与 #1 相同的操作。构建 SQL 后,运行 raw 查询。
  3. 转换为使用 django-haystack 以使用全文搜索引擎。这是很多基础设施,并且由于必须重写代码以预测搜索引擎结果而具有很多潜在的负面影响。根据您选择插入 haystack 的后端,它可能足够聪明,能够理解输入的字符串并正确搜索……或者您可能必须手动生成大量字符串表示形式才能出现在搜索索引中,以便它们可以正常查询。总的来说,这种类型的东西是全文搜索引擎擅长的,因为它们理解语言。数据库不会,它们理解数据并且不会变得模糊。

你所要求的或多或少是相当困难的。我认为最可行的选择是转换为使用 haystack。我不能足够强调这有多少缺点。您正在处理搜索引擎结果而不是模型实例。在某些情况下这不是问题,但根据要求,这可能会很痛苦。

【讨论】:

  • 正如我对上面评论的回答:我想过滤日期,其文本表示包含输入的子字符串。
猜你喜欢
  • 2020-05-01
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多