2011-11-29 9 views
26

¿Es posible filtrar de forma selectiva qué registros genera el comando de gestión de volcado de Django? Tengo algunos modelos, cada uno con millones de filas, y solo quiero volcar registros en un modelo que se ajuste a un criterio específico, así como a todos los registros vinculados de clave externa que hacen referencia a cualquiera de esos registros.Django Selective Dumpdata

Considere este caso de uso. Supongamos que tengo una base de datos de producción donde mi modelo de usuario tiene millones de registros. Tengo varios otros modelos (Log, Transaction, Purchase, Bookmarks, etc.) que hacen referencia al modelo de usuario. Quiero hacer desarrollo en mi aplicación Django, y quiero probar usando datos realistas. Sin embargo, mi base de datos de producción es tan enorme que no puedo tomar una instantánea de todo el asunto y cargarlo localmente. Entonces, idealmente, me gustaría utilizar dumpdata para volcar 50 registros de usuario aleatorios y todos los registros relacionados a JSON, y usarlos para llenar una base de datos de desarrollo.

¿Hay una manera fácil de lograr esto?

+1

Buena pregunta. Y a veces también quiere quitar algunos campos (como contraseñas, etc.) si desea que los datos de esta prueba sean públicos. – Mitar

Respuesta

16

Creo que vale la pena echarle un vistazo a django-fixture-magic.

Encontrará información de fondo adicional en Scrubbing your Django database.

+0

Tuve que modificar este código un poco, y aun así es un poco ineficiente, pero esto generalmente me funciona. – Cerin

+0

sí, yo también: https://github.com/davedash/django-fixture-magic/issues/45 – daigorocub

3

Esta no es una respuesta simple a mi pregunta, pero encontré algunos documentos interesantes en el natural keys feature incorporado de Django, que permitiría representar registros serializados sin la clave principal. Desafortunadamente, no parece que esto esté completamente integrado en dumpdata, y existe un antiguo outstanding ticket para confiar plenamente en las claves naturales.

También parece que la función serializers.serialize() permite la serialización de una lista arbitraria de instancias de modelo específicas.

Presumiblemente, si implementé un método natural_key() en todos mis modelos, y luego llamé a serializers.serialize ([Users.objects.filter (criteria)]), debería estar cerca de lograr lo que quiero. Podría tener que escribir una función para rastrear todas las referencias de FK e incluirlas en la lista de objetos pasados ​​a serializar().

5

Este fragmento puede ser útil para usted (que sigue las relaciones y serializa):

http://djangosnippets.org/snippets/918/

Se podría utilizar también ese comando gestión y anular los gestores por defecto para cualquier modelos que quisiera volver personalizada querysets.

+1

fork fija/actualizada del fragmento anterior: https://djangosnippets.org/snippets/10506/ – tutuDajuju

Cuestiones relacionadas