Python Django rest获取查询参数序列化程序

Python Django rest获取查询参数序列化程序,python,django,Python,Django,我希望接收带有查询参数的get查询和筛选数据集(如果存在)。我目前正在使用下面列出的dumb方法。在这种情况下,我不喜欢它没有检查日期是否可以被解析。在另一种方法中,我可能希望只接收可以解析为int的数字字符串。是否有一些很酷的python方法可以做到这一点,而无需编写一堆样板代码 class TrackList(APIView): @token_required def get(self, request, pk, **kwargs): # read quer

我希望接收带有查询参数的get查询和筛选数据集(如果存在)。我目前正在使用下面列出的dumb方法。在这种情况下,我不喜欢它没有检查日期是否可以被解析。在另一种方法中,我可能希望只接收可以解析为int的数字字符串。是否有一些很酷的python方法可以做到这一点,而无需编写一堆样板代码

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 rest序列化程序?

我认为对于上述情况,我们必须使用包
Django过滤器。
要安装它,最好使用通用视图

  • 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
    
    参考文献:


    我认为对于上述情况,我们必须使用包
    django过滤器
    。 要安装它,最好使用通用视图

  • 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
    
    参考文献:


    你需要自己做。检查此项或此项可能会发现django筛选器有用:你需要自己做。检查此项或此项可能会发现django筛选器有用:现在,django筛选器使用“field\u name”而不是“name”筛选器。DateFilter(*field\u name*=“date”)…现在,django筛选器使用“field\u name”而不是“name”“名称”过滤器。日期过滤器(*字段\ U名称*=“日期”。。。。