如何使用字符串过滤日期?

时间:2012-03-27 16:37:44

标签: python django django-models

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

querySet.filter(datefield__icontains=searchString)

导致MySQL异常: 警告:日期时间值不正确:' %%'对于专栏''在第1行

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

我不确定在过滤日期数据时你会想到的图标可以做什么,所以你可能想重新考虑或澄清你的期望。

总的来说,您正在尝试根据日期字段进行查询。你有2个选择。您需要将sting转换为日期(或日期时间)对象,或者需要将字符串格式化为" yyyy-mm-dd"。

- 编辑 -

因为看起来你真的想要使用字符串来搜索日期,所以这里有一些澄清。

你要做的事情将是难以做到的。我不能接近边界线。 Django正在将您的查询转换为SQL并查询您的数据库。仅仅因为ORM不能使它能够在SQL中执行不可能的事情(实际上ORM极大地限制了你可以做的事情)。但是,您有几种选择:

  1. 编写python来解析字符串并提出日期对象以匹配它们。这可能非常困难。然后,您将需要使用Q中的django.db.models个对象来构造复杂的OR查询。当它以任何合理的数字或记录到达数据库时,这可能会很慢。
  2. 弄清楚SQL生成您尝试做什么的样子。这并不容易IMO,因为存在如此多的差异,数据库中日期的基础表示不会成为一个字符串,所以你真的会为它做准备。除了手动之外,这基本上是手动执行与#1相同的操作。构建SQL后,运行raw查询。
  3. 转换为使用django-haystack以使用全文搜索引擎。这是很多基础设施,并且由于必须重写代码以预测搜索引擎结果而存在很多潜在的负面影响。根据您选择插入haystack的后端,它可能足够聪明,能够理解输入的字符串并正确搜索...或者您可能必须手动生成大量的字符串表示形式,以便在搜索索引中使用它们可以正确查询。总的来说,这种类型的东西是全文搜索引擎擅长的,因为他们理解语言。数据库没有,他们理解数据,他们不会模糊。
  4. 或多或少你要求的东西很难。在我看来,最可行的选择是转换为使用haystack。我无法强调那有多少弊端。您正在处理搜索引擎结果而不是模型实例。在某些情况下,这不是一个问题,但根据要求,这可能会非常痛苦。