django 过滤器上的日期范围
daterange on a django-filter
我使用 Django,Django REST Framework 加上 django-filters (alex/django-filter)。
我有一个包含 start_date 和 end_date 字段的模型,我正在尝试构建一个日期 api-endpoint,它应该接收一个日期并响应其中的项目( start_date < 日期)和(end_date > 日期)。
有一个 DateRangeFilter 但我不知道如何使用它。到目前为止,这是我的代码:
urls.py:
url(r'^api/sales/$', views.SaleItemList.as_view(), name='sales'),
views.py:
class SaleItemFilter(django_filters.FilterSet):
city = django_filters.CharFilter(name='trade_item__vendor__city')
title = django_filters.CharFilter(name='trade_item__title')
date = django_filters.DateRangeFilter()
class Meta:
model = SaleItem
fields = ['sale_price', 'sale_date_start', 'sale_date_end', 'trade_item']
class SaleItemList(generics.ListAPIView):
queryset = SaleItem.objects.all()
serializer_class = SaleItemListSerializer
filter_class = SaleItemFilter
serializers.py:
class SaleItemListSerializer(serializers.ModelSerializer):
class Meta:
model = SaleItem
fields = ("sale_price", "sale_date_start", "sale_date_end", "trade_item", "slogan")
我可以筛选到目前为止的确切日期:
/api/sales/?sale_date_start=2015-05-22
我无法谈论你问题中的 Django REST Framework 部分,但我希望我能对 django-filter 部分提供一些见解!
如果您使用 DateRangeFilter,结果将是一个包含 "any date"、"today"、"past 7 days"、"this month" 和 "this year" 选项的下拉列表。
如果您的变量是 'date',其中任何一个都会为您提供带有标签 "Date Range":
的日期范围
date_range = DateRangeFilter(field_name='date')
date = DateRangeFilter(label='Date_Range')
不同之处在于,如果您使用第一个,您可以再次使用您的变量 "date",这样您就可以让您的用户选择按开始日期、结束日期或两者进行过滤(以获取之间的日期),都使用相同的日期变量。
(等号左边的"date"只能用一次(或不能用))。
要获取开始和结束日期,请执行以下操作:
start_date = DateFilter(field_name='date',lookup_expr=('lt'),)
end_date = DateFilter(field_name='date',lookup_expr=('gt'))
您不需要在 Meta 中再次调用 "date",但您可以。你确实需要打电话。它可能是您的日期,或者您要过滤的其他字段。
这是完整的代码和截图示例:
from django_filters import DateRangeFilter,DateFilter
from wesapp.models import MyModel
class SaleItemFilter(django_filters.FilterSet):
start_date = DateFilter(name='date',lookup_type=('gt'),)
end_date = DateFilter(name='date',lookup_type=('lt'))
date_range = DateRangeFilter(name='date')
class Meta:
model = SaleItem
fields = ['entered_by',]
您也可以尝试 DateFromToRangeFilter
这将使您能够这样做:
f = F({'date_0': '2016-01-01', 'date_1': '2016-02-01'})
其中 F 是 FilterSet
class 和 date = DateFromToRangeFilter
https://django-filter.readthedocs.io/en/stable/ref/widgets.html#rangewidget
只是对当前 django 版本的编辑将 name
替换为 field_name
,将 lookup_type
替换为 lookup_expr
:
下面给出了 filters.py 文件的示例
from django.contrib.auth.models import User
import django_filters
class UserFilter(django_filters.FilterSet):
username = django_filters.CharFilter(lookup_expr='icontains')
first_name = django_filters.CharFilter(lookup_expr='icontains')
last_name = django_filters.CharFilter(lookup_expr='icontains')
year_joined = django_filters.NumberFilter(field_name='date_joined', lookup_expr='year',label='Year Joined')
year_joined__gt = django_filters.NumberFilter(field_name='date_joined', lookup_expr='year__gt',label='Year Joined Greater Than')
year_joined__lt = django_filters.NumberFilter(field_name='date_joined', lookup_expr='year__lt',label='Year Joined Less Than')
date_range = django_filters.DateRangeFilter(field_name='date_joined')
start_date = django_filters.DateFilter(field_name='date_joined',lookup_expr='lt',label='Date joined is before (mm/dd/yyyy):')
end_date = django_filters.DateFilter(field_name='date_joined',lookup_expr='gt',label='Date joined is after (mm/dd/yyyy):')
class Meta:
model = User
fields = ['username', 'first_name', 'last_name', ]
我知道这是旧的 post 但要给出额外的答案,您还可以通过以下方法启用 from 和 to datepicker。使用 django_filters.
的日期选择器
import django_filters
from django_filters.widgets import RangeWidget
Date = django_filters.DateFromToRangeFilter(widget=RangeWidget(attrs={'type': 'date'}))
我使用 Django,Django REST Framework 加上 django-filters (alex/django-filter)。
我有一个包含 start_date 和 end_date 字段的模型,我正在尝试构建一个日期 api-endpoint,它应该接收一个日期并响应其中的项目( start_date < 日期)和(end_date > 日期)。 有一个 DateRangeFilter 但我不知道如何使用它。到目前为止,这是我的代码:
urls.py:
url(r'^api/sales/$', views.SaleItemList.as_view(), name='sales'),
views.py:
class SaleItemFilter(django_filters.FilterSet):
city = django_filters.CharFilter(name='trade_item__vendor__city')
title = django_filters.CharFilter(name='trade_item__title')
date = django_filters.DateRangeFilter()
class Meta:
model = SaleItem
fields = ['sale_price', 'sale_date_start', 'sale_date_end', 'trade_item']
class SaleItemList(generics.ListAPIView):
queryset = SaleItem.objects.all()
serializer_class = SaleItemListSerializer
filter_class = SaleItemFilter
serializers.py:
class SaleItemListSerializer(serializers.ModelSerializer):
class Meta:
model = SaleItem
fields = ("sale_price", "sale_date_start", "sale_date_end", "trade_item", "slogan")
我可以筛选到目前为止的确切日期:
/api/sales/?sale_date_start=2015-05-22
我无法谈论你问题中的 Django REST Framework 部分,但我希望我能对 django-filter 部分提供一些见解!
如果您使用 DateRangeFilter,结果将是一个包含 "any date"、"today"、"past 7 days"、"this month" 和 "this year" 选项的下拉列表。
如果您的变量是 'date',其中任何一个都会为您提供带有标签 "Date Range":
的日期范围date_range = DateRangeFilter(field_name='date')
date = DateRangeFilter(label='Date_Range')
不同之处在于,如果您使用第一个,您可以再次使用您的变量 "date",这样您就可以让您的用户选择按开始日期、结束日期或两者进行过滤(以获取之间的日期),都使用相同的日期变量。
(等号左边的"date"只能用一次(或不能用))。
要获取开始和结束日期,请执行以下操作:
start_date = DateFilter(field_name='date',lookup_expr=('lt'),)
end_date = DateFilter(field_name='date',lookup_expr=('gt'))
您不需要在 Meta 中再次调用 "date",但您可以。你确实需要打电话。它可能是您的日期,或者您要过滤的其他字段。
这是完整的代码和截图示例:
from django_filters import DateRangeFilter,DateFilter
from wesapp.models import MyModel
class SaleItemFilter(django_filters.FilterSet):
start_date = DateFilter(name='date',lookup_type=('gt'),)
end_date = DateFilter(name='date',lookup_type=('lt'))
date_range = DateRangeFilter(name='date')
class Meta:
model = SaleItem
fields = ['entered_by',]
您也可以尝试 DateFromToRangeFilter
这将使您能够这样做:
f = F({'date_0': '2016-01-01', 'date_1': '2016-02-01'})
其中 F 是 FilterSet
class 和 date = DateFromToRangeFilter
https://django-filter.readthedocs.io/en/stable/ref/widgets.html#rangewidget
只是对当前 django 版本的编辑将 name
替换为 field_name
,将 lookup_type
替换为 lookup_expr
:
下面给出了 filters.py 文件的示例
from django.contrib.auth.models import User
import django_filters
class UserFilter(django_filters.FilterSet):
username = django_filters.CharFilter(lookup_expr='icontains')
first_name = django_filters.CharFilter(lookup_expr='icontains')
last_name = django_filters.CharFilter(lookup_expr='icontains')
year_joined = django_filters.NumberFilter(field_name='date_joined', lookup_expr='year',label='Year Joined')
year_joined__gt = django_filters.NumberFilter(field_name='date_joined', lookup_expr='year__gt',label='Year Joined Greater Than')
year_joined__lt = django_filters.NumberFilter(field_name='date_joined', lookup_expr='year__lt',label='Year Joined Less Than')
date_range = django_filters.DateRangeFilter(field_name='date_joined')
start_date = django_filters.DateFilter(field_name='date_joined',lookup_expr='lt',label='Date joined is before (mm/dd/yyyy):')
end_date = django_filters.DateFilter(field_name='date_joined',lookup_expr='gt',label='Date joined is after (mm/dd/yyyy):')
class Meta:
model = User
fields = ['username', 'first_name', 'last_name', ]
我知道这是旧的 post 但要给出额外的答案,您还可以通过以下方法启用 from 和 to datepicker。使用 django_filters.
的日期选择器import django_filters
from django_filters.widgets import RangeWidget
Date = django_filters.DateFromToRangeFilter(widget=RangeWidget(attrs={'type': 'date'}))