09 Filtros
Para implementar o filtro você pode definir manualmente o filtro na sua view, utilizando parâmetros de query (query params
) para filtrar o content_type
diretamente na sua consulta.
Exemplo de View com Filtro Manual
Aqui está uma implementação usando uma ListAPIView
, onde o filtro é feito verificando o valor do parâmetro content_type
na requisição.
# app/views.py
from rest_framework import generics
from rest_framework.response import Response
from .models import Content
from .serializers import ContentSerializer
class ContentListView(generics.ListAPIView):
serializer_class = ContentSerializer
def get_queryset(self):
queryset = Content.objects.all()
content_type = self.request.query_params.get('content_type')
if content_type in [choice[0] for choice in Content.CONTENT_TYPE_CHOICES]:
queryset = queryset.filter(content_type=content_type)
return queryset
Explicação
- Recuperação do Parâmetro de Query: A função
get_queryset()
verifica se o parâmetrocontent_type
foi enviado na requisição (self.request.query_params.get('content_type')
). - Validação do Parâmetro: A verificação
if content_type in [choice[0] for choice in Content.CONTENT_TYPE_CHOICES]
assegura que o valor decontent_type
corresponde a uma das escolhas válidas definidas no modeloContent
. - Aplicação do Filtro: Se o parâmetro
content_type
for válido (audio
ouvideo
), ele será aplicado ao queryset usandofilter(content_type=content_type)
.
Testando o Filtro
Você pode acessar os endpoints da seguinte forma:
- Para filtrar apenas conteúdos de áudio:
- Para filtrar apenas conteúdos de vídeo:
Filtros para os Campos Title e Description
Para adicionar filtros pelos campos title
e description
, você pode usar o mesmo método de query params dentro da sua view, permitindo que os usuários filtrem os conteúdos com base em partes do título ou descrição. No Django, você pode usar consultas __icontains
para fazer uma busca parcial e insensível a maiúsculas e minúsculas.
Atualizando a View para Filtrar title
e description
Vamos modificar a função get_queryset
para incluir os parâmetros title
e description
:
# app/views.py
from rest_framework import generics
from .models import Content
from .serializers import ContentSerializer
class ContentListView(generics.ListAPIView):
serializer_class = ContentSerializer
queryset = Content.objects.all()
def get_queryset(self):
queryset = Content.objects.all()
# Filtro por tipo de conteúdo (audio/video)
content_type = self.request.query_params.get('content_type')
if content_type in [choice[0] for choice in Content.CONTENT_TYPE_CHOICES]:
queryset = queryset.filter(content_type=content_type)
# Filtro por título (parcial e insensível a maiúsculas/minúsculas)
title = self.request.query_params.get('title')
if title:
queryset = queryset.filter(title__icontains=title)
# Filtro por descrição (parcial e insensível a maiúsculas/minúsculas)
description = self.request.query_params.get('description')
if description:
queryset = queryset.filter(description__icontains=description)
return queryset
Explicações
- Filtro de
content_type
: O mesmo que antes, filtrando apenas secontent_type
está presente nos valores válidos. - Filtro de
title
: Se o parâmetrotitle
é passado, a consultafilter(title__icontains=title)
procura por conteúdos que contenham o valor detitle
em qualquer parte do título, sem diferenciar maiúsculas de minúsculas. - Filtro de
description
: O mesmo princípio é aplicado ao parâmetrodescription
comfilter(description__icontains=description)
.
Teste o Filtro
Agora você pode usar os parâmetros content_type
, title
e description
para filtrar os conteúdos:
- Para buscar conteúdos de áudio com "Music" no título:
- Para buscar conteúdos com "Tutorial" na descrição:
- Para combinar filtros (exemplo, vídeos com "Adventure" no título):
Esse código permite aplicar os filtros title
e description
de forma simples e diretamente na view.