Поиск DateFields по формату A в Django Admin, хотя они хранятся в формате B - PullRequest
1 голос
/ 15 июня 2011

Я создаю приложение Django. И от администратора требуется иметь возможность поиска элементов на основе запросов, которые также могут включать названия месяца, года и т. Д.

Проблема (кажется, я не могу найти решение этой проблемы в SO или в другом месте), заключается в том, что формат по умолчанию для дат в Django (хорошо, способ сохранения дат в хранилище данных) - это% Y- % m-% d, но я хочу иметь возможность выполнять поиск по запросу типа «Июнь» в поиске администратора Django.

Как мне сделать возможным поиск в полях даты, используя пользовательские форматы даты, без преобразования форматов, в которых сохраняются даты?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2013

Вы, вероятно, уже нашли ответ, но он может быть полезен кому-то (как и я!), Все еще изучающему это.

Джанго 1,6 + : Вы можете настроить результаты поиска: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_search_results

Предыдущие версии Django : Вам просто нужно использовать свой собственный список изменений для временного изменения формата даты в строке запроса. Обратите внимание, что формат изменяется только временно, поэтому пользователь не увидит никаких изменений в строке запроса.

Пример, приведенный ниже, принимает формат даты в Великобритании, например, «31 декабря 1999 года», но его можно легко изменить, чтобы он принимал любой формат даты (или просто название месяца, например, «июнь» по запросу @nemesisfixx)

В вашей модели администратора настройте класс списка изменений:

  class MyModelAdmin(admin.ModelAdmin):
     ...
     def get_changelist(self, request, **kwargs):
        """
        Returns the ChangeList class for use on the changelist page.
        """
        return MyChangeList

Затем в классе MyChangeList:

class MyChangeList(ChangeList):
def get_query_set(self, request):
    # Allow date search with UK format
    try:
        date_search = datetime.datetime.strptime(self.query, '%d %b %Y').date().strftime('%Y-%m-%d')
    except ValueError:
        date_search = self.query
    with temporary_value(self, 'query', date_search):
        qs = super(MyChangeList, self).get_query_set(request)
        return qs
0 голосов
/ 15 июня 2011

Дата и время хранятся в базе данных как отдельный тип для них, потому что вы должны быть в состоянии выполнять специальные операции даты и времени, такие как поиск больше, меньше, а не просто поиск строки.

Django ORM принимаетдата-время в виде строк, отформатированных в одном из стандартных форматов, включая строки, целые числа и datetime объекты.

Пример:

Entry.objects.filter(pub_date__year=2006)

или

Entry.objects.filter(
...     headline__startswith='What'
... ).exclude(
...     pub_date__gte=datetime.now()
... ).filter(
...     pub_date__gte=datetime(2005, 1, 1)
... )

Вы можете использовать любую из нескольких библиотек для разбора времени в строке до datetime объектов.Проще всего было бы использовать классную библиотеку dateutil:

import dateutil.parser
dateutil.parser.parse('2008-08-09T18:39:22Z')
#Following is returned
datetime.datetime(2008, 8, 9, 18, 39, 22, tzinfo=tzutc())
...