【发布时间】:2016-03-24 01:15:46
【问题描述】:
我在前端使用DataTables,它允许全局搜索(遍历所有字段以查找匹配项)。
这就是我希望在 django(版本 1.9.1)中能够做到的:
- 使用“ma”作为 DateField 的过滤器,以便所有 3 月和 5 月的日期 被退回
或
- 使用“Mar 1”作为 DateField 的过滤器,以便 3 月 10 日 - 3 月 19 日返回
经过一番修改,我有了这个自定义查找
from django.db.models import Lookup
from django.db.models.fields import DateField
@DateField.register_lookup
class DateTextFilter(Lookup):
lookup_name = 'dttxt'
def as_postgresql(self, compiler, connection):
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs = self.rhs.strftime("%b %d, %Y")
return "to_char(%s,'Mon DD, YYYY') ~* '%s'", ([lhs,rhs])
我是这样运行的:
outputQ = Q(**{"appt_date"+"__dttxt" : "Mar 09"})
Appts.objects.filter(outputQ)
它生成运行的 SQL(在 Postgres 中),但是当我运行 filter() 时,我得到错误
ValidationError: [u"'Mar 09' value has an invalid date format.
It must be in YYYY-MM-DD format."]
公平地说,“3 月 9 日”不是一个有效的日期——但原始 SQL 是有效的并且可以运行(我用 '2016-03-09' 对此进行了测试以绕过这个错误并让 django 来创建 SQL)
SELECT "appts"."appt_id", "appts"."client_id", "appts"."therapist_id",
"appts"."agency_id", "appts"."appt_date", "appts"."appt_start",
"appts"."appt_end", "appts"."cpt_code", "appts"."client_owe",
"appts"."insur1_owe", "appts"."insur2_owe", "appts"."note",
"appts"."note_flag", "appts"."ct_fee_pd", "appts"."subm_date",
"appts"."updated" FROM "appts" WHERE to_char("appts"."appt_date",'Mon DD,
YYYY') ~* 'Mar 09'
我可以使用extra(),但这将被弃用。
我可能最终会使用 SO algorithm 解析字符串(使用原始 sql 对获得此功能的妥协太大了),但我会失去一些我想要的功能。
不确定这是否可行...
【问题讨论】:
标签: django django-models