#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 файл так легко к легкому