Как отфильтровать даты, используя строку? - PullRequest
1 голос
/ 27 марта 2012

Данные на странице могут быть отфильтрованы по пользовательскому вводу.Введенная строка получена в запросе ajax, и я пытаюсь фильтровать объекты по этой строке.Строковые поля фильтруются нормально, но когда я пытаюсь отфильтровать по дате:

querySet.filter(datefield__icontains=searchString)

Это приводит к исключению MySQL: Предупреждение: неверное значение даты и времени: '%%' для столбца '' в строке 1

Есть ли способ отфильтровать поля даты, используя строку?

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

Вам необходимо создать datetime объекты из строки и затем отфильтровать, используя этот объект. Возможно, вы захотите отфильтровать объекты, у которых дата больше или меньше объекта datetime. Для этого вы можете использовать filter(datefield__gt=datetime_obj) или filter(datefield__lt=datetime_obj)

2 голосов
/ 27 марта 2012

Я не уверен, что вы ожидаете, что icontain будет делать при фильтрации данных даты, поэтому вы можете переосмыслить это или уточнить, что вы ожидаете.

В целом вы пытаетесь сделать запрос на основе поля даты. У вас есть 2 варианта. Вам нужно либо преобразовать свое жало в объект даты (или даты / времени), либо отформатировать строку как «гггг-мм-дд».

- редактировать -

Поскольку похоже, что вы действительно пытаетесь использовать строки для поиска дат, это своего рода разъяснение.

То, что вы хотите сделать, будет труднее сделать. Я бы пошел с границей невозможно. Django переводит ваши запросы в SQL и запрашивает вашу базу данных. Тот факт, что ORM существует, не делает невозможным то, что невозможно в SQL (фактически ORM сильно ограничивает то, что вы можете делать). Тем не менее, у вас есть несколько вариантов:

  1. Напишите python для синтаксического анализа строк и поиска объектов date для их соответствия. Это может быть довольно сложно. Затем вы захотите использовать Q объекты из django.db.models для построения сложного запроса OR. Это, вероятно, будет медленным, когда он попадет в базу данных с любым разумным числом или записями.
  2. Выясните, как будет выглядеть SQL для генерации того, что вы пытаетесь сделать. Это не будет легким IMO, так как существует так много различий, и базовое представление дат в вашей базе данных не будет строкой, так что вы действительно будете в этом заинтересованы. По сути, это вручную делает то же самое, что делает # 1, кроме как вручную. После того, как вы создали SQL, выполните запрос raw.
  3. Преобразование в использование django-haystack для использования полнотекстового поискового движка. Это большая инфраструктура, и в ней много потенциальных минусов от необходимости переписывать свой код, чтобы предвидеть результаты поисковой системы. В зависимости от того, какой бэкэнд вы решите подключить к стогу сена, он может быть достаточно умен, чтобы понимать введенные строки и правильно искать ... или вам может потребоваться вручную сгенерировать тонну строковых представлений, чтобы они были в вашем поисковом индексе, чтобы они можно правильно запросить. В целом, этот тип вещей - то, в чем превосходят полнотекстовые поисковые системы, потому что они понимают язык. Базы данных нет, они понимают данные, и они не становятся нечеткими.

Более или менее то, что вы просите, довольно сложно. На мой взгляд, наиболее приемлемый вариант - перейти на использование стога сена. Я не могу подчеркнуть, как много недостатков в этом. Вы имеете дело с результатами поиска, а не с экземплярами моделей. В некоторых случаях это не проблема, но в зависимости от требований это может быть довольно болезненным.

...