2013-04-18 9 views
9

Sto tentando di utilizzare il metodo call_command per chiamare il dumpdata command. Manualmente, lo uso come segue per salvare i dati in un file.Come utilizzare call_command con il comando dumpdata per salvare json su file

python manage.py dumpdata appname_one appname_two > /path/to/save/file.json 

e salva il file json. Ora, mi trovo in una situazione in cui devo chiamare questo comando usando il metodo call_command.

sono in grado di stampare il JSON dal comando utilizzando il seguente:

from django.core.management import call_command 

call_command('dumpdata', 'appname_one', 'appname_two') 

C'è un modo per salvare i dati forniti in un file, come lo facciamo dalla riga di comando?

risposta

11

ha dovuto reindirizzare sys.stdout al file per ottenere quanto sopra. Qualcosa di simile a.

import sys 

from django.core.management import call_command 


sysout = sys.stdout 
sys.stdout = open('filename.json', 'w') 
call_command('dumpdata', 'appname_one', 'appname_two') 
sys.stdout = sysout 
+1

Grazie Amyth. Questo è quello che dovevo usare quando uso django-fixture-magic per fare un custom_dump in un'azione di amministrazione. – wilblack

10

Un modo ancora migliore è utilizzare il reindirizzamento stdout incorporato di Django per i moduli di comando. Vedi docs here.

Se si vuole manipolare il flusso prima di inviarlo a un file, si può anche passare un buffer StringIO:

import os 
from cStringIO import StringIO 

from django.core import management 

def create_fixture(app_name, filename): 
    buf = StringIO() 
    management.call_command('dumpdata', app_name, stdout=buf) 
    buf.seek(0) 
    with open(filename, 'w') as f: 
     f.write(buf.read()) 
+1

Penso che 'create_fixture' possa essere semplificato: con open (nomefile, 'w') come f: management.call_command ('dumpdata', app_name, stdout = f) –

2

Sto usando Django apparecchio magia https://github.com/davedash/django-fixture-magic e la necessità di scaricare un dispositivo personalizzato. Ho provato diversi modi, ma ho finito per usare la risposta di Amyth perché era l'unico modo in cui funzionava.

Qui è la mia azione di amministrazione che funziona con il dispositivo magico

def export_survey(modeladmin, request, queryset): 

    sysout = sys.stdout 

    survey = queryset[0] 
    fname = "%s.json" %(survey.slug) 
    response = HttpResponse(mimetype='application/json') 
    response['Content-Disposition'] = 'attachment; filename=%s' %(fname) 

    sys.stdout = response 
    call_command('custom_dump', 'complete_survey', survey.id) 
    sys.stdout = sysout 
    return response 

export_survey.short_description = "Exports a single survey as a .json file" 
0

DB infissi in genere comprimono bene, e loaddata possono leggere infissi compressi. Per scrivere direttamente un apparecchio .bz2:

import bz2 

with bz2.BZ2File('db.json.bz2', 'w', buffering=1024) as f: 
    django.core.management.call_command('dumpdata', stdout=f) 
Problemi correlati