Creando fixtures a partir de un QuerySet en Django

Alguien del trabajo me planteó hace unos días la necesidad de crear manualmente una colección de datos de prueba a partir de los datos existentes en la base de datos de nuestra aplicación en desarrollo, pero utilizando solamente un subconjunto de los datos de la tabla.

El camino habitual para crear un conjunto de datos de ejemplo (Fixtures) que utilizamos es el conocido comando dumpdata. Normalmente crearíamos un directorio para almacenarlos, especificando en el archivo settings.py

FIXTURE_DIRS = (
   '/ruta/a/las/fixtures/',
)

Y, desde el directorio base de nuestro desarrollo, ejecutaríamos un comando como:

python manage.py dumpdata --format=json myapp > /ruta/a/las/fixtures/data.json

Podemos especificar solamente una aplicación, algunos modelos o exportar todos los datos. Incluso podemos filtrar según una lista de claves primarias mediante el parámetro --pks según podemos leer en la documentación oficial de Django:

https://docs.djangoproject.com/en/dev/ref/django-admin/#django-admin-dumpdata

El problema surge cuando queremos filtrar los datos siguiendo un criterio contreto, es decir, cuando queremnos obtener todos los objetos especificando un QuerySet.

No debemos olvidar que esto es simplemente Python, así que podemos realizar nuestra consulta, serializarla a JSON y después guardar el archivo.

Unas cuantas líneas de código desde el shell serán suficientes:

python manage.py shell

>>> from django.core import serializers
>>> from myapp.models import MyModel
>>> datos = serializers.serialize('json', MiModelo.objects.filter(atributo='valor para filtrar'))
>>> with open('datos_exraidos.json', 'w') as archivo_json:
...   archivo_json.write(datos)
...
4519

Con esta operación tan simple tenemos exactamente la colección de datos que estábamos buscando.

Escrito el 17 de diciembre de 2018 |