2009-12-07 15 views
6

Necesito completar mi base de datos con un montón de entradas ficticias (alrededor de 200+) para poder probar la interfaz de administración que he creado y me preguntaba si había una mejor manera para hacerlo. Pasé la mayor parte de mi día ayer tratando de rellenarlo a mano (es decir, envolviendo cosas como esta my_model (title = "asdfasdf", field2 = "laksdj" ...) en un grupo de "para x en el rango (0,200): "bucles" y se dio por vencido porque no funcionó de la manera que yo esperaba. Creo que es necesario usar this, pero ¿no necesita tener datos (existentes) en la base de datos para que esto funcione?Django - Llenando una base de datos con fines de prueba

+0

No desea serializar. Desea crear datos iniciales ejecutando en el shell, guardando las instancias y luego exportando la base de datos a un dispositivo en un formato como json usando loaddata: 'python manage.py dumpdata --format = json --indent = 4 appname' @Matthew Schinckel es el más cercano en esto. – hughdbrown

Respuesta

7

Comprobar esta aplicación

https://github.com/aerosol/django-dilla/

Digamos que usted escribió la aplicación de blog (oh sí, su favorito!) En Django. Las pruebas unitarias funcionaron bien, y todo funciona extremadamente rápido, incluso las consultas ultra largas de ORM. Has agregado varias publicaciones clasificadas y todavía es estable como una roca. Está bastante seguro de que la aplicación es eficiente y está lista para la implementación en vivo. ¿Derecha? Incorrecto.

+0

Esto es exactamente el tipo de cosa que estaba buscando. ¡Gracias un montón! – cornjuliox

+0

@Eeyore: su respuesta no me deja dormir. – misterte

4

Puede utilizar accesorios para este fin y el comando de administración loaddata.

Un enfoque es hacerlo así.

  1. Prepare su base de datos de pruebas.

  2. Use dumpdata para crear la exportación JSON de la base de datos.

  3. Ponga esto en el directorio fixtures de su aplicación.

  4. Escriba sus pruebas unitarias para cargar este "accesorio".

+0

Solo tuve que agregar algunos detalles. –

0

No estoy seguro de por qué necesita una serialización. Siempre que haya configurado su archivo Django settings.py para que apunte a su base de datos de prueba, rellenar una base de datos de prueba no debe ser más que guardar modelos.

for x in range(0, 200): 
    m = my_model(title=random_title(), field2=random_string(), ...) 
    m.save() 

Hay mejores formas de hacerlo, pero si desea un conjunto de pruebas rápidas, este es el camino a seguir.

+0

Y se está ejecutando en el contexto del shell, ¿verdad? 'python manage.py shell' – hughdbrown

3

Django fixtures proporcionan un mecanismo para importar datos en syncdb. Sin embargo, hacer esta propagación de datos inicial a menudo es más fácil a través del código de Python. La técnica que perfila debería funcionar, ya sea a través de syncdb o un comando de administración. Por ejemplo, a través de syncdb, en my_app/management.py:

def init_data(sender, **kwargs): 
    for i in range(1000): 
     MyModel(number=i).save() 

signals.post_syncdb.connect(init_data) 

O, en un management command en myapp/management/commands/my_command.py:

from django.core.management.base import BaseCommand, CommandError 

from models import MyModel 

class MyCommand(BaseCommand): 
    def handle(self, *args, **options): 
     if len(args) > 0: 
      raise CommandError('need exactly zero arguments') 

     for i in range(1000): 
      MyModel(number=i).save() 

A continuación, puede exportar estos datos a un dispositivo, o seguir importando usando el comando de gestión. Si elige continuar utilizando la señal syncdb, querrá ejecutar condicionalmente la función init_data para evitar que los datos se importen en las siguientes llamadas syncdb. Cuando un accesorio no es suficiente, personalmente me gusta hacer las dos cosas: crear un comando de administración para importar datos, pero tener la primera invocación syncdb hacer la importación automáticamente. De esta forma, la implementación es más automatizada, pero aún puedo realizar modificaciones en los datos iniciales y volver a ejecutar la importación.

0

recomendaría django-autofixtures a usted. Intenté tanto django_seed como django-autofixtures, pero django_seed tiene muchos problemas con claves únicas. django-autofixtures se encarga de las restricciones de base de datos únicas, primarias y otras al completar la base de datos

Cuestiones relacionadas