如何使用 django_filters.DateFilter?

mat*_*ass 4 python django django-filter

我尝试使用 django_filter 的 DateFilter 按确切日期进行过滤,但无法让它返回任何结果。

myapp/models.py

from django.db import models

class Event(models.Model):
    start = models.DateField()
    title = models.CharField(_'title'), max_length=256)
Run Code Online (Sandbox Code Playgroud)

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',)
Run Code Online (Sandbox Code Playgroud)

例如:我有一个开始日期为 2012 年 1 月 14 日的活动。当我在日期过滤器中输入该值时,它什么也不返回。

我无法在 django_filter 的文档站点中找到有关 DateFilter 的更深入的描述,无论是在其过滤器参考还是使用 django-filter 指南中。或者一般的任何地方。有什么想法我可能做错了什么吗?

我不认为日期选择器小部件的日期格式有任何问题,因为它以另一种形式使用(用于输入数据)并且工作正常。

附加信息:我正在使用 django-1.6 以及 django-filter 的最新版本

mat*_*ass 6

发现问题了。

'start'字段是日期时间字段。因此,当仅查询日期时,找不到匹配项,因为它与时间不匹配。

例如:

如果我输入 01/14/2012,它会查找开始日期datetime.date(2012, 01, 14, 0, 0),但实际开始日期可能是datetime.datetime(2012, 01, 14, 21, 0, tzinfo=<UTC>)

解决方案:

使用lookup_type='startswith'or 'lookup_type='contains'( source ) 但'contains'似乎更快

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

    ...
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以按日期过滤日期时间字段

start = django_filters.DateFilter('start__date')
Run Code Online (Sandbox Code Playgroud)