Как использовать библиотеку Django-RQL для фильтрации полей типа ‘Time’ в Django Rest Framework?

#python-3.x #django #django-rest-framework #filtering

#python-3.x #django #django-rest-framework #фильтрация

Вопрос:

Я хотел бы использовать filter в моем REST API в моем поле ‘hora’, но ваш тип — Time. Когда я пытаюсь выполнить запрос, пример: 127.0.0.1:8000/api/v1/queimadas/?hora=17:15:33, отображается сообщение об ошибке: «Ошибка синтаксического анализа RQL».

Моя задача — фильтровать это поле ‘hora’ между временами, вот так: ?ge (hora, 17:00:00) amp; le (hora, 20:00:00) в url (следуя документации), но я не могу: (

Большое всем спасибо.

Это документация библиотеки django-rql — https://django-rql.readthedocs.io/en/latest/index.html

Мой serializers.py:

 class QueimadaSerializer(serializers.ModelSerializer):
    satelite = SateliteSerializer(many=False,read_only=True)
    cidade = CidadeSerializer(many=False,read_only=True)
    class Meta:
        model = Queimada
        fields = [
        'id',
        'latitude' ,
        'longitude', 
        'data',
        'hora' ,
        'observacao',
        'veracidade', 
        'visitado',
        'satelite', 
        'cidade' 
        ]
  

Мой views.py:

 class QueimadasViewSet(viewsets.ModelViewSet):
    queryset = Queimada.objects.all()
    serializer_class = QueimadaSerializer
    filter_backends = (RQLFilterBackend,)
    rql_filter_class = QueimadaFilters


    @action(detail=True,methods=['get'])
    def satelite(self,request,pk=None):
        satelite = Satelite.objects.filter(queimada__id=pk)
        self.pagination_class.page_size = 10
        page = self.paginate_queryset(satelite)
   
        if page is not None:
            serializer = SateliteSerializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = SateliteSerializer(satelite, many=True)
        return Response(serializer.data)
  

Мой filters.py:

 class QueimadaFilters(RQLFilterClass):
    MODEL = Queimada
    SELECT = True
    FILTERS = (
    {
        'namespace' : 'cidade',
        'filters':('id','nome'),
        'qs' : SelectRelated('cidade'),

    },
    {
        'filter': 'data',

    },
    {
        'filter': 'hora',
        'custom': True,
        'lookups': {
            FilterLookups.EQ,
            FilterLookups.IN, 
            FilterLookups.I_LIKE,
            FilterLookups.LE,
            FilterLookups.LT,
            FilterLookups.GE, 
            FilterLookups.GT
        },
    },
)
  

Ответ №1:

Я рекомендовал вам использовать django_filters. Он очень прост в использовании.

Ответ №2:

Это может помочь

 from rest_framework import filters

class UserListView(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_backends = [filters.SearchFilter]
    search_fields = ['username', 'email']

  

установите django-filter
и объявите его в settings.py файл так легко к легкому