Как использовать django_filters.DateFilter?

Я пытаюсь использовать DateFilter django_filter для фильтрации по точной дате, но не могу заставить его вернуть какой-либо результат.

myapp / models.py

from django.db import models

class Event(models.Model):
    start = models.DateField()
    title = models.CharField(_'title'), max_length=256)

myapp / filters.py

from myapp.models import Event
import django_filters

class EventFilter(django_filters.FilterSet):
    start = django_filters.DateFilter(
        'start', label=_('With start date'),
        widget=forms.DateInput() # I'm using a datepicker-like widget to enter date
    )

    class Meta:
        model = Event 
        fields = ('start',)

Например: у меня есть событие с датой начала 14.01.2012. Когда я ввел это значение в фильтр даты, он ничего не вернул.

Мне не удалось найти более подробное описание DateFilter на сайте документации django_filter, ни в его справочник по фильтрам или Использование django-filter руководства < / а>. Или вообще где угодно. Есть идеи, что я делаю неправильно?

Я не ожидаю, что что-то не так с форматом даты из виджета datepicker, поскольку он используется в другой форме (для ввода данных) и работает нормально.

Дополнительная информация: я использую django-1.6 и любую последнюю версию django-filter


person mathiass    schedule 13.02.2014    source источник
comment
Возможно, это не связано или просто опечатка при вставке вашего кода в SO, но fields = ('start') является строкой и должна быть fields = ('start',)   -  person Scott Woodall    schedule 13.02.2014
comment
Спасибо - это моя опечатка. Это fields = ( 'start', ) в коде.   -  person mathiass    schedule 13.02.2014
comment
Нужен ли 'start' в ... = django_filters.DateFilter('start', ...?   -  person mathiass    schedule 13.02.2014
comment
Определение fields ограничит поля, с которыми может работать фильтр. В вашем примере title недоступен.   -  person Scott Woodall    schedule 13.02.2014
comment
Должно ли имя переменной фильтра соответствовать имени поля модели? Например, если имя поля модели start, могу ли я использовать start_date в качестве переменной фильтра?   -  person mathiass    schedule 14.02.2014
comment
Я отвечаю на свои вопросы о 'start' в django_filters.Datefilter('start', ...) и названии переменной фильтра. В первом случае 'start' - это значение аргумента name для фильтра, относящееся к полю, к которому должен применяться фильтр. Если этот аргумент не указан (последний), по умолчанию django_filter принимает имя переменной в качестве имени поля. источник   -  person mathiass    schedule 14.02.2014


Ответы (2)


Нашел проблему.

Поле 'start' - это DateTimeField. Таким образом, при запросе только даты совпадения не найдено, потому что оно никогда не совпадает с временем.

Например:

Если я введу 14.01.2012, он будет искать дату начала datetime.date(2012, 01, 14, 0, 0), но фактическая дата начала может быть datetime.datetime(2012, 01, 14, 21, 0, tzinfo=<UTC>).

Решение:

Используйте lookup_type='startswith' или 'lookup_type='contains' (исходный код), но 'contains' оказывается быстрее

Class EventFilter(django_filters.FilterSet):
    start = django_filters.DateFilter(
        'start', label=_('With start date'),
        lookup_type='contains' # use contains
    )

    ...
person mathiass    schedule 14.02.2014

Вы можете фильтровать поле datetime по дате

start = django_filters.DateFilter('start__date')
person Jonhatan Fajardo    schedule 09.01.2021