Proyecto API de películas con Django Rest Framework

Top de películas favoritas y filtros

Ésta podría bien ser la parte más compleja del proyecto, pues tenemos que encontrar una forma de contar el número de favoritos de cada película y devolver la lista de películas ordenadas a partir de ese campo.

Por suerte me sé un truquillo que nos hará la vida mil veces más fácil.

Lo que vamos a hacer es crear un nuevo campo en la película que almacene el número de favoritos. Este campo lo actualizaremos automáticamente al crearse o borrarse una instancia de PeliculaFavorita.

api/models.py

favoritos = models.IntegerField(default=0)

Luego abajo del todo crearemos la señal que hará toda la magia, actualizando el contador a partir de una consulta inversa de esas que tanto me gustan:

api/models.py

from django.db.models.signals import post_save, post_delete

def update_favoritos(sender, instance, **kwargs):
  count = instance.pelicula.peliculafavorita_set.all().count()
  instance.pelicula.favoritos = count
  instance.pelicula.save()

# en el post delete se pasa la copia de la instance que ya no existe
post_save.connect(update_favoritos, sender=PeliculaFavorita)
post_delete.connect(update_favoritos, sender=PeliculaFavorita)  

Migramos los cambios:

pipenv run make
pipenv run migrate

Como utilizamos el campo all en el serializador se supone que ya nos devolverá automáticamente este nuevo campo.

Y ya lo tenemos, el detalle maestro lo pondremos añadiendo un par de filtros de ordenamiento y búsqueda al ViewSet de películas que DRF maneja automáticamente. Así permitiremos ordenar las películas por número de favoritos y realizar búsquedas a partir del título:

api/views.py

from rest_framework import viewsets, views, filters

class PeliculaViewSet(viewsets.ModelViewSet):
  filter_backends = [filters.SearchFilter, filters.OrderingFilter]
  search_fields = ['titulo']
  ordering_fields = ['favoritos']

Ahora desde la interfaz web de DRF podemos filtrar y ordenar las películas.

Con esto hemos acabado la primera parte, os espero en mi curso SPA: Frontend web para gestionar películas favoritas dónde os enseño a crear un genial cliente web para esta API usando Nuxt.js, no os lo perdáis.