django,限制泛型.ListAPI按用户输入的filterset_field的周查看



django新手,并以api开始。我希望我的视图接受一个筛选器集字段,然后在一周内返回大于该字段的数据。我目前设置的视图是

views.py

class MeterView(generics.ListAPIView):
queryset = MeterLake.objects.all()
serializer_class = MeterLakeSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = {'siteid' : ['exact'], 
'createdtimestamp' : ['gte'],

}

然后用户会输入url/?createdtimestamp=日期然后,我想获取用户输入的日期,并返回该日期后一周以上的信息。

理想情况下,我想为此使用分页,但我不确定如何使用非常感谢您的帮助!

您可以通过提供要使用的自定义filterset_class而不是当前使用的简写方式来自定义createdtimestamp筛选器字段的使用方式。

例如,通过提供过滤器的方法,可以调整用于查找的值。


from django_filters import rest_framework as filters
from datetime import datetime, timedelta
class MeterLakeFilter(filters.FilterSet):
createdtimestamp = filters.BooleanFilter(
field_name='createdtimestamp', method='filter_a_week_from_date'
)
class Meta:
model = MeterLake
fields = ['createdtimestamp', 'siteid']
def filter_a_week_from_date(self, queryset, name, value):
lookup = f'{name}__gte'
dateformat = '%Y-%m-%d' # replace with expected value format.
# value may be serialized already, thus not needing to be parsed here.
value = datetime.strptime(value, dateformat) + timedelta(days=7)
return queryset.filter(**{lookup: value})

class MeterView(generics.ListAPIView):
queryset = MeterLake.objects.all()
serializer_class = MeterLakeSerializer
filter_backends = [DjangoFilterBackend]
filterset_class = MeterLakeFilter

使用Oluwafemi Sule的答案,我可以调整自定义过滤器和通用视图,以按siteid和输入的时间戳后一周进行搜索。我还添加了一些功能,如果没有指定时间戳,则将时间范围限制为从今天起一周。

class MeterLakeFilter(filters.FilterSet):
siteid = filters.CharFilter(field_name='siteid')
createdtimestamp = DateTimeFilter(field_name = 'createdtimestamp', method = 'filter_a_week_from_date')

class Meta:
model = MeterLake
fields = ['siteid', 'createdtimestamp']
def filter_a_week_from_date(self,queryset, name, value):

if self.request.query_params.get('createdtimestamp', 'None') == None:
lookup = f'{name}__gte'
value = datetime.now() + timedelta(days=7)
return queryset.filter(**{lookup: value})

else:
value2 = value + timedelta(days=7)
return queryset.filter(createdtimestamp__lte = value2, createdtimestamp__gte = value)
class MeterView(generics.ListAPIView):

queryset = MeterLake.objects.all()
serializer_class = MeterLakeSerializer
filter_backends = [DjangoFilterBackend,OrderingFilter]
filterset_class = MeterLakeFilter
ordering_fields = ['siteid', 'createdtimestamp']
ordering = ['siteid', 'createdtimestamp']
def get_queryset(self):
if self.request.query_params.get('createdtimestamp', None) == None:
start_date = datetime.utcnow().replace(tzinfo=pytz.utc)
end_date = start_date - timedelta(days=7)
queryset = MeterLake.objects.filter(createdtimestamp__gte = end_date).order_by('createdtimestamp')

return queryset
else:

pass

最新更新