2010-02-08 21 views
8

¿Hay alguna forma de cargar un dispositivo y cargar varios dispositivos?Cargar accesorios múltiples al mismo tiempo

Me idealmente le gustaría escribir:

python manage.py loaddata all_fixtures 

Y tener que cargar todos los datos en lugar de tener que escribir todo. es posible?

+0

puede darle nosotros un ejemplo de cómo se ve el directorio de su dispositivo, más específicamente, ¿qué archivos hay en él? – buckley

Respuesta

15

Usar $ python manage.py loaddata myfixtures/*.json funcionaría ya que Bash sustituirá el comodín por una lista de nombres de archivos coincidentes.

+1

En Mac OS X obtengo: "UserWarning: no se encontró ningún dispositivo llamado '*'". –

8

¿Por qué no crear un Makefile que atraiga todos sus accesorios? por ejemplo, algo como:

load_all_fixtures: 
    ./manage.py loaddata path/to/fixtures/foo.json 
    ./manage.py loaddata path/to/fixtures/bar.json 
    ./manage.py loaddata path/to/fixtures/baz.json 

Y luego en el intérprete de comandos, ejecute

make load_all_fixtures 

(Este tipo de enfoque también es bueno para la ejecución de pruebas unitarias para solamente y haciendo caso omiso de los demás ciertas aplicaciones, si es necesario)

+0

El fragmento de arriba es lo que necesitaría en su 'Makefile' –

+0

make: No hay nada que hacer para 'load_all_fixtures'. Tengo este error –

0

Manage.py loaddata se verá automáticamente en ciertos lugares, por lo que si nombra sus accesorios igual en cada aplicación, o coloque todos sus accesorios en la misma carpeta, puede ser fácil cargarlos todos. Si tiene muchos accesorios diferentes y necesita un esquema de nomenclatura más complejo, puede cargar fácilmente todos sus dispositivos utilizando find -exec

buscar. -name "* .json" -exec manage.py loaddata {} \;

Como digo en este [question][2], también tengo esto en un fabfile. EDITAR: use python manage.py si manage.py no está en su ruta VE.

2

Si usted quiere tener este trabajo en Linux y Windows simplemente podría utilizar esto para cargar todas sus JSON-Accesorios:

import os 
files = os.listdir('path/to/my/fixtures') 

def loaddata(file): 
    if os.path.splitext(file)[1] == '.json' and file != 'initial_data.json': 
     print file 
     os.system("python manage.py loaddata %s" % file) 

map(loaddata, files) 
0

Este es mi mandamiento, simple. (django 1.6)

python manage.py loaddata a.json b.json c.json 
6

Tengo varias aplicaciones en el directorio del proyecto y tengo cada aplicación con el directorio 'fixtures'. Por lo tanto el uso de algún golpe que puedo hacer:

python3 manage.py loaddata */fixtures/*.json

Y que se expande todos los archivos JSON dentro del directorio de accesorios para cada aplicación en mi proyecto. Puede probarlo Haciendo simple:

ls */fixtures/*.json

3

Este hilo muestra arriba entre los primeros resultados con un "cargar datos de todas las instalaciones de" búsqueda de Google y no menciona lo que la OMI es la solución correcta para esto, es decir, la solución que le permite cargar cualquier accesorio que desea sin ningún tipo de trucos comodín ni una sola modificación del archivo settings.py (I también se utiliza para hacerlo de esta manera)

Simplemente haga accesorios directorios de tus aplicaciones plana (y no el esquema habitual de Django que, por ejemplo, va app_name/templates/app_name/mytemplate.html), es decir, app_name/fixtures/myfixture.[JSON, YAML, XML]

Esto es lo que la django doc dice:

Por ejemplo:

django-admin loaddata foo/bar/mydata.json 

sería buscar /fixtures/foo/bar/mydata.json para cada aplicación instalada, /foo/bar/mydata.json para cada directorio en FIXTURE_DIRS, y la ruta literal foo/bar/mydata.json.

Lo que esto significa es que si usted tiene unos accesorios/myfixture.json en todos los directorios de aplicaciones, sólo hay que ejecutar

./manage.py loaddata myfixture 

para cargar todos los aparatos que se encuentran allí dentro de su proyecto ... Y eso es ! Incluso puedes restringir las aplicaciones desde las que cargas los accesorios utilizando --app o --exclude arguments.

Mencionaré que utilizo mis accesorios solo para poblar mi base de datos mientras realizo algún desarrollo, así que no me importa tener una estructura plana en mis directorios de 'accesorios' ... Pero incluso si usa sus accesorios para las pruebas parece tener una estructura plana es la forma Django-esque ir, y como that answer sugiere, que haría referencia a la fijación de una aplicación específica con sólo escribir algo como:

class MyTestCase(TestCase): 
    fixtures = ['app_name/fixtures/myfixture.json'] 
0

Después de hacer un poco de búsqueda , Terminé escribiendo este guion. Busca en todos los directorios denominados "accesorios" para archivos .json y ejecuta una "python manage.py loaddata {fixture_name} .json". A veces, el orden es importante para las restricciones de clave externa, por lo que deja un accesorio en la cola si la restricción no se puede resolver.

(Nota: Se requiere que el paquete PIP simple_terminal que escribí Y configurarlo para ser dirigido por 'python manage.py runscript', que requiere django-extensions..)

# load_fixture.py 
# 
# A script that searches for all .json files in fixtures directories 
# and loads them into the working database. This is meant to be run after 
# dropping and recreating a database then running migrations. 
# 
# Usage: python manage.py runscript load_fixtures 

from simple_terminal import Terminal 

from django.core.management import call_command 
from django.db.utils import IntegrityError 


def load_fixture(fixture_location): 
    # runs command: python manage.py loaddata <fixture_location> 
    call_command('loaddata', fixture_location) 


def run(): 
    with Terminal() as t: 
     # get all .json files in a fixtures directory 
     fixture_locations = t.command(
      'find . -name *.json | grep fixtures | grep -v env') 

    while fixture_locations: 
     # check that every iteration imports are occuring 
     errors = [] 
     length_before = len(fixture_locations) 

     for fl in fixture_locations: 
      try: 
       # try to load fixture and if loaded remove it from the array 
       load_fixture(fl) 
       print("LOADED: {}".format(fl)) 
       fixture_locations.remove(fl) 
      except IntegrityError as e: 
       errors.append(str(e)) 

     # if import did not occur this iteration raise exception due to 
     # missing foreign key reference 
     length_after = len(fixture_locations) 
     if length_before == length_after: 
      raise IntegrityError(' '.join(errors)) 
Cuestiones relacionadas