如何使用 django_filters.DateFilter?
Posted
技术标签:
【中文标题】如何使用 django_filters.DateFilter?【英文标题】:How to use django_filters.DateFilter? 【发布时间】:2014-03-11 16:24:50 【问题描述】:我正在尝试使用 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)
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',)
例如: 我有一个开始日期为 2012 年 1 月 14 日的活动。当我在日期过滤器中输入该值时,它什么也不返回。
我无法在 django_filter 的文档站点中找到关于 DateFilter 的更深入的描述,无论是在其 filter reference 或 Using django-filter guide 中。或一般的任何地方。有什么想法我可能做错了吗?
我不认为 datepicker 小部件中的日期格式有任何问题,因为它以另一种形式使用(用于输入数据)并且工作正常。
附加信息:我正在使用 django-1.6 以及 django-filter 的最新版本
【问题讨论】:
可能不相关,或者只是将代码粘贴到 SO 中的拼写错误,但fields = ('start')
是一个字符串,应该是 fields = ('start',)
谢谢 - 这是我的错字。代码中是fields = ( 'start', )
。
'start'
中的... = django_filters.DateFilter('start', ...
有必要吗?
定义fields
将限制过滤器可以使用的字段。在您的示例中,title
不可用。
过滤变量的名称是否必须与模型的字段名称匹配?例如,如果模型字段名称为start
,我可以使用start_date
作为过滤变量吗?
【参考方案1】:
发现问题。
'start'
字段是一个 DateTimeField。因此,当仅查询日期时,找不到匹配项,因为它从不匹配 时间。
例如:
如果我输入 01/14/2012,它会查找开始日期 datetime.date(2012, 01, 14, 0, 0)
,但实际开始日期可能是 datetime.datetime(2012, 01, 14, 21, 0, tzinfo=<UTC>)
。
解决方案:
使用lookup_type='startswith'
或'lookup_type='contains'
(source) 但'contains'
似乎更快
Class EventFilter(django_filters.FilterSet):
start = django_filters.DateFilter(
'start', label=_('With start date'),
lookup_type='contains' # use contains
)
...
【讨论】:
【参考方案2】:您可以按日期过滤日期时间字段
start = django_filters.DateFilter('start__date')
【讨论】:
以上是关于如何使用 django_filters.DateFilter?的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]
如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?