我想通过查询参数(如果存在)接收获取查询和过滤数据集。我目前正在使用下面列出的哑法。在这种情况下,我不喜欢它不检查日期实际上是否可以被解析的事实。在另一种方法中,我可能只想接收可以解析为int的数字字符串。是否有一些很酷的 pythonic 方法可以在不写一堆样板代码的情况下完成它?
class TrackList(APIView):
@token_required
def get(self, request, pk, **kwargs):
# read query params
date_from = self.request.query_params.get('date_from')
date_to = self.request.query_params.get('date_to')
# if present then filter
if date_from and date_to:
points = Track.objects.filter(user_id=pk, date__range=[date_from, date_to])
# otherwise don't filter
else:
points = Track.objects.filter(user_id=pk)
points.order_by('date')
serializer = TrackListSerializer(points, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
UPD:问题实际上并不是关于 dateutil.parser ,而是关于通用查询参数解析器。也许我应该使用Django休息序列化器?
答案 0 :(得分:1)
我认为对于上述情况,我们必须使用包django-filter
。
要安装它pip install django-filter
,最好使用通用视图。
在settings.py
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
使用观点&过滤
from rest_framework import generics
from django_filters import rest_framework as filters
from myapp import Track
class TrackFilter(filters.FilterSet):
from_date = filters.DateFilter(name="date", lookup_expr='gte')
to_date = filters.DateFilter(name="date", lookup_expr='lte')
class Meta:
model = Track
fields = ['date']
class TrackListAPIView(generics.ListAPIView):
queryset = Track.objects.all()
serializer_class = TrackListSerializer
filter_backends = (DjangoFilterBackend,) # optional
filter_class = TrackFilter
用法:
http://localhost:8000/api/endpoint/?from_date=2018-01-01&to_date=2018-01-18
参考文献:
http://django-filter.readthedocs.io/en/1.1.0/ref/filterset.html
http://www.django-rest-framework.org/api-guide/filtering/