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_typefoi 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_typecorresponde a uma das escolhas válidas definidas no modeloContent. - Aplicação do Filtro: Se o parâmetro
content_typefor válido (audioouvideo), 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_typeestá 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 detitleem qualquer parte do título, sem diferenciar maiúsculas de minúsculas. - Filtro de
description: O mesmo princípio é aplicado ao parâmetrodescriptioncomfilter(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.