Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django筛选器上的日期范围_Python_Django_Django Rest Framework_Django Filters - Fatal编程技术网

Python django筛选器上的日期范围

Python django筛选器上的日期范围,python,django,django-rest-framework,django-filters,Python,Django,Django Rest Framework,Django Filters,我使用Django,Django REST框架加上Django过滤器(alex/Django过滤器) 我有一个带有start_date和end_date字段的模型,我正在尝试构建一个date api端点,该端点应该接收一个日期,并用其中的项目(start_datedate)进行响应。 有一种方法,但我不知道如何使用它。以下是我目前的代码: URL.py: url(r'^api/sales/$', views.SaleItemList.as_view(), name='sales'), view

我使用Django,Django REST框架加上Django过滤器(alex/Django过滤器)

我有一个带有start_date和end_date字段的模型,我正在尝试构建一个date api端点,该端点应该接收一个日期,并用其中的项目(start_datedate)进行响应。 有一种方法,但我不知道如何使用它。以下是我目前的代码:

URL.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\u date\u start=2015-05-22

我无法回答您问题中的Django REST框架部分,但我希望我能对Django过滤器部分提供一些见解

如果使用DateRangeFilter,结果将是一个下拉列表,其中包含选项“任意日期”、“今天”、“过去7天”、“本月”和“今年”

如果变量为“日期”,则其中任何一个变量都将为您提供一个带有标签“日期范围”的日期范围:

不同之处在于,如果使用第一个变量,则可以再次使用变量“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
类,带有
date=DateFromToRangeFilter


仅对当前django版本进行编辑,将
名称替换为
字段名称
,将
查找类型
替换为
查找表达式

下面给出了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', ] 

我知道这是一篇老文章,但要给出额外的答案,您可以通过以下方法启用from和to datepicker。使用django_过滤器的日期选择器

import django_filters
from django_filters.widgets import RangeWidget

Date = django_filters.DateFromToRangeFilter(widget=RangeWidget(attrs={'type': 'date'}))

如何让每个日期显示两个框而不是一个?仅供参考:
lookup\u type
在以后的版本中似乎已更改为
lookup\u expr
,而不是
name
,我正是在寻找它。简单易用。我也这么做了,但我得到的是
“DateFromToRangeFilter”对象没有属性“split”
错误。你能帮帮我吗。当我尝试其他Filterset方法时,我得到了相同的错误。
import django_filters
from django_filters.widgets import RangeWidget

Date = django_filters.DateFromToRangeFilter(widget=RangeWidget(attrs={'type': 'date'}))