django
  • django-rest-framework
  • 2016-04-06 17 views 2 likes 
    2

    を動作しませicontains ":45:2016-03-29T01を01.419731Z" データベースDjangoの残りのフレームワークDjangoFilterBackendは、私が日時持っ

    では、これが私のフィルターです:

    class TaipeiTimeFilter(filters.FilterSet): 
        taipei_time = django_filters.DateTimeFilter(name="update_time", lookup_type='icontains') 
    
        class Meta: 
         model = DataData 
         fields = ['taipei_time',] 
    
    class DataList(generics.ListAPIView): 
        queryset = DataData.objects.all() 
        serializer_class = DataSerializer 
        filter_backends = (filters.DjangoFilterBackend,) 
        filter_class = TaipeiTimeFilter 
    

    しかし、私はhttp://127.0.0.1:8000/api/data/?taipei_time=2016-03-29
    を問い合わせます 何も見つかりませんでした。私のフィルターで何が問題になっていますか?

    答えて

    1

    は、おおよその文字列一致用です。おおよその日時のマッチングを試みています。そのためには、日時の範囲が必要です。

    from django.db.models import Q 
    import django_filters 
    
    class RangeFilter(django_filters.Filter): 
        def filter(self,qs,value): 
    
         tokens = value.split('..') 
         if len(tokens) != 2: 
          return qs 
         (begin, end) = tokens 
         if begin == '' and end == '': 
          return qs 
         if begin != '' and end != '': 
          return qs.filter(Q(**{'%s__range'%self.name:(begin,end)})) 
         elif begin != '': 
          return qs.filter(Q(**{'%s__gte'%self.name:begin})) 
         elif end != '': 
          return qs.filter(Q(**{'%s__lte'%self.name:end})) 
    

    これは、同じように使用されています:私は、私は、この目的のために定義されたカスタムフィルタを使用

    taipei_time = RangeFilter(name="update_time") 
    

    をし、クエリは次のようになります。

    http://127.0.0.1:8000/api/data/?taipei_time=2016-03-29..2016-03-30 
    
    +0

    はどうもありがとうございました。そして、私は '' '' django_filters.CharFilter''''、 '' 'icontains'''の作品に変更しました – user2492364

    関連する問題