2016-06-28 9 views
0

Я использовал datetime.datetime.now() для хранения datefield в моей модели, которая сохраняется как 2016-06-27 15:21:17.248951+05:30. Теперь я хочу сравнить datefield с значением datetime, получаемым от внешнего интерфейса, например Thu May 26 2016 00:00:00 GMT 0530 (IST). Как Django запрашивает модель для сравнения обоих полей даты?Как сравнить два поля Datetime в Django

# models.py 

datefield = models.DateTimeField(blank=True,null=True) 

Я попытался преобразования datefield получать от интерфейса с помощью split() и remove() функцию Python, чтобы создать его в формате, как 2016-06-27 13:25:35.

Но до сих пор нет решения и получения Null, даже если сравнивать это значение даты (2016-06-27 13:25:35) значение с этим (2016-06-27 12: 36: 34.898593 + 00) значение , так как дата в обоих значениях одинакова.

Я проверил его с помощью простого запроса Django следующим образом:

company_details.objects.filter(datefield=datefield).only('par1','par2',...) 
+0

Вы хотите сравнить дату и время на форуме? или только дата? –

+0

Мне нужно только для сравнения –

+0

Обратите внимание, что 'datetime.datetime.now()' время, не поддерживающее часовой пояс, и тот, который вы получаете от внешнего интерфейса, имеет часовой пояс. Понятно, что вы не можете сравнивать их. – RemcoGerlich

ответ

1

После того, как вы преобразовали дату от переднего конца в формате ISO, как 2016-06-27 13:25:35, вы можете использовать его для запроса модели с одним из этих

Model.objects.filter(date_created__startswith=today) 
Model.objects.filter(date_created__contains=today) 

Он работает также, если вы только для фильтрации на определенную дату, например 2016-06-27.

Model.objects.filter(date_created__startswith=date(2016, 6, 27)) 

Чтобы разобрать строку даты вы получаете от интерфейса, есть два варианта.

Если ваша строка даты хорошо отформатирована, вы можете просто проанализировать ее, например, datestring.strftime('%Y-%m-%d %H:%M:%S'), чтобы получить объект datetime().

Если ваша строка даты ненадежная и может быть отформатирована по-разному, что вы не можете предсказать, я бы рекомендовал использовать DateUtil. Он поставляется с парсером, который попытается преобразовать любую строку в дату-время, например

>>> from dateutil.parser import parse 
>>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) 
(datetime.datetime(2011, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) 
+0

Hey my datefield не в% Y-% m-% d% H:% M:% S этот формат, поэтому я не могу использовать strftime, также я не могу использовать синтаксический анализ для преобразования его в требуемый формат. Но независимо от того, что вы дали, работает отлично, спасибо за помощь –

1

Сравните дату и время, как это. Просто дайте переменную вроде этого '%Y-%m-%d %H:%M:%S' столько, сколько вы хотите.

In [1]: from datetime import datetime 
In [2]: past = datetime.now() 
In [3]: present = datetime.now() 
In [4]: present.strftime('%Y-%m-%d %H:%M:%S') == past.strftime('%Y-%m-%d %H:%M:%S') 
Out[17]: False 
In [5]: present.strftime('%Y-%m-%d %H:%M') == past.strftime('%Y-%m-%d %H:%M') 
Out[2]: True 

Если вы хотите сравнить только date использовать подобное.

if present.date() == past.date(): 
    #Do your stuff 
+0

У меня нет обеих дат в том же формате. Мне нужен запрос, который будет сравнивать оба поля даты и фильтровать все данные в базе данных на основе отфильтрованного поля datetime. –

+0

Затем конвертируйте в один формат, например 'datetime', затем сравните с ним. Как вы можете сравнивать данные в другом формате? –

+0

Очевидно, что я не могу, вы можете мне сказать, как преобразовать это (май 26 2016 00:00:00 GMT 0530 (IST)) в этом формате (2016-06-27 12: 36: 34.898593 + 00)? –

Смежные вопросы