Django import-export, solo exportar un objeto con objetos relacionados.
Tengo un formulario que permite a un usuario registrarse en nuestro sitio web. Ahora necesito exportar todos los datos a Excel, así que recurrí al paquete de importación-exportación. Tengo 3 modelos, Cliente, Referencia y Contacto. Los dos últimos tienen una relación m2m con Cliente. También creé Recursos para estos modelos. Cuando uso Resource().export()
al final de mi método done()
en mi vista de formulario, exporta todos los objetos existentes en la base de datos, lo cual no es lo que quiero.
Intenté buscar esto en Google y solo obtuve un resultado, que básicamente dice que necesito usar before_export()
, pero no puedo encontrar en ninguna parte de la documentación cómo funciona en realidad.
Intenté consultar manualmente a mi cliente de esta manera:
cliente = Cliente.objects.filter(pk=cliente.id)
datos_cliente = RecursoCliente().export(cliente)
Lo cual funciona bien, pero luego estoy atascado con las referencias y los contactos relacionados: datos_referencia = RecursoReferencia().export(cliente.referencias)
me da un TypeError que dice que el objeto ManyRelatedManager
no es iterable. Lo cual tiene sentido porque export()
espera una queryset, pero no estoy seguro de si es posible obtenerlo de esa manera.
¡Agradezco cualquier ayuda!
davy.ai
Solución para exportar datos específicos utilizando django-import-export en Django
Cuando se utiliza django-import-export para exportar datos a Excel, a veces solo queremos exportar datos específicos en lugar de todos los objetos existentes en la base de datos.
En este escenario, el usuario tiene tres modelos:
Customer
(Cliente),Reference
(Referencia) yContact
(Contacto). TantoReference
comoContact
tienen una relación de muchos a muchos conCustomer
, y el usuario ha creado recursos para estos modelos.Para exportar datos específicos, el usuario puede utilizar
before_export()
en su clase de recurso. Este método se llama justo antes de la exportación y le permite al usuario modificar los datos a exportar.Por ejemplo, el usuario puede anular
before_export()
para filtrar los datos que desea exportar según alguna condición. En este caso, el usuario puede filtrar el objetoCustomer
y sus objetos relacionadosReference
yContact
, de la siguiente manera:En
before_export()
, el usuario primero obtiene lospk
de todos los objetosCustomer
enqueryset
. Luego filtra los objetosCustomer
en función de lospk
y, para cadaCustomer
, asigna sus objetos relacionadosReference
yContact
.Tenga en cuenta que los campos
references
ycontacts
deben estar definidos en la clase de recurso, y también se deben definirdehydrate_references()
ydehydrate_contacts()
para exportar correctamente los objetos relacionados.Ahora, al llamar a
Resource().export()
en la vista, solo se exportarán los datos filtrados a Excel.