Añadida la carpeta /media/ a las rutas para que Django sirva las imágenes que se sube a través de la API.

Si la API nos devuelve como URL de la imagen subida "uploads/image.jpg" podremos acceder a ella a través de http://127.0.0.1:8000/media/uploads/image.jpg
Se añade un e-mail de bienvenida en HTML cuando un usuario se registra a través de la API, para depurarlo, abrir un terminal y poner:

python -m smtpd -n -c DebuggingServer localhost:1025
He creado una clase Permission personalizada para controlar la autorización y la autenticación sobre las operaciones de las fotos.

IMPORTANTE: las Permissions funcionan siembre sobre las classes GenericViews!!!! NO FUNCIONAN SOBRE LAS APIVIew normales (salvo que nosotros implementemos las llamadas a dichas funciones).
Ahora respondemos también en XML al añadir el XMLRenderer a las opciones del proyecto.

Para que nos responda en XML, debemos enviar la cabecera HTTP:

Accept: application/xml

Que significa: "Hola señor servidor, dueño del API para dominarnos a todos, hijo de HTTP, heredero de TCP/IP, envíeme los datos en XML porque es el formato que yo controlo. Gracias"
He añadido los filter backends que permiten buscar y ordenar en el API por ciertos campos.

Si por ejemplo quiero buscar fotos que contengan la palabra "darth" en los campos nombre, descripción e incluso el nombre de su propietario y, además, quiero que los resultados se me devuelvan ordenados por nombre de manera inversa y por propietario como segundo criterio, tengo que hacer la siguiente petición GET:

http://0:8000/api/1.0/photos/?search=darth&ordering=-name,owner
He refactorizado las URLs para que queden dentro de la app, de esta manera esta app y sus URLs es más portable.
He cambiado las URLs para que cada una tenga un nombre a modo de identificador.

De esta manera, no es necesario escribir las URLs en el sistema sino que podemos usar nombres de manera que, si alguien decide cambiar la URL, no tenemos que revisar las plantillas donde aparece, sino simplemente cambiar el patrón y listo.

Al referenciar las URLs por nombre, un cambio de URL en una web no es nada doloroso.

¿Mola o no?
Reemplazo los APIViews de potos (listado y detalle) por un viewset y generlo las URLs del viewset con un router (para no tener que mapear a mano los métodos).
Creo el viewset de usuarios, que no se basa en un ModelViewset. Simplemente junto las clases UserListAPI y UserDetailAPI y renombro los métodos:

UserListAPI.get -> list
UserListAPI.post -> create
UserDetailAPI.get -> retrieve
UserDetailAPI.put -> update
UserDetailAPI.delete -> destroy