Django-admin exportar a CSV

Trabajando en una aplicación web con Django para automatizar tareas que realizo en mi día a día, me surgió la necesidad de exportar todos los objetos de un modelo a CSV, después de un corto plazo investigando encontré la siguiente solución:

from .models import MiModelo # Modelo que vamos a utilizar
from django.contrib import admin
from django.http import HttpResponse
import csv

@admin.register(MiModelo)
class MiModeloAdmin(admin.ModelAdmin):
    '''Admin View for MiModelo'''

    list_display = '__all__'

    # Añadimos a las acciones un string con el nombre de la
    # funcion
    actions = (
        'export_as_csv',
    )

    def export_as_csv(self, request, queryset):
        """ Export CSV action """
        # En meta almacenamos el nombre del archivo
        meta = self.model._meta
        # Guardamos una lista con los nombres de los campos
        field_names = [field.name for field in meta.fields]

        # Creamos una HttpResponse para enviar el archivo CSV
        response = HttpResponse(content_type='text/csv')
        # Indicamos el nombre del archivo (meta)
        response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta)
        # Creamos un objeto csv que va a escribir en nuestro HttpResponse
        writer = csv.writer(response)

        # El metodo writerow escribe secuencialmente los elementos de la lista que recibe
        # por parametro en las columas del csv y realiza un salto de linea
        writer.writerow(field_names)
        # En queryset tenemos almacenados los objetos que seleccionamos, recorremos la lista
        # para escribir sus elementos en el csv.
        for obj in queryset:
            row = writer.writerow([getattr(obj, field) for field in field_names])

        # Devolvemos el objeto HttpResponse
        return response
    # Le ponemos un nombre bonito.
    export_as_csv.short_description = 'Exportar a CSV'

Resumen

Como vemos en el código los pasos a seguir serían los siguientes:

  1. Importar el modelo
  2. Importar las función HttpResponse de  django.http y la libreria csv
  3. Creamos la clase para nuestro modelo heredando de ModelAdmin
  4. Añadimos la función export_as_csv
  5. Le damos un nombre bonito con la propiedad short_description
  6. Para acabar la añadimos a la lista de acciones (actions)

 

Bonus

Si queréis utilizar la fuente del logo de django es DTL Prokyon T Bold y la podéis descargar aquí