2013-04-18 8 views
9

Próbuję użyć metody call_command do wywołania dumpdata command. Ręcznie, używam go w następujący sposób, aby zapisać dane w pliku.Jak używać polecenia call_command z komendą dumpdata do zapisania json do pliku

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

i zapisuje plik json. Teraz jestem w sytuacji, w której muszę wywołać to polecenie, używając metody call_command.

jestem w stanie wydrukować json z komendy przy użyciu następujących:

from django.core.management import call_command 

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

Czy istnieje sposób mogę zapisać danych do pliku, jak to zrobić z wiersza polecenia?

Odpowiedz

11

musiał przekierować plik sys.stdout do pliku, aby osiągnąć powyższe. Coś jak.

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

Dzięki Amyth. Właśnie tego musiałem użyć, gdy używałem django-fixture-magic do wykonania custom_dump w akcie administratora. – wilblack

10

Jeszcze lepszym sposobem jest użycie wbudowanego przekierowania standardowego Django dla swoich modułów sterujących. Zobacz docs here.

Jeśli chcesz manipulować strumienia przed wysłaniem go do pliku, można również przekazać ją bufor 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

Myślę, że 'create_fixture' można uprościć: z open (filename, 'w') jako f: management.call_command ('dumpdata', app_name, stdout = f) –

2

Używam Django osprzętu magiczną https://github.com/davedash/django-fixture-magic i trzeba zrzucić niestandardowego osprzętu. Próbowałem na kilka sposobów, ale skończyło się na tym, że użyłem odpowiedzi Amytha, ponieważ był to jedyny sposób, który zadziałał.

Oto moje działanie administratora, który współpracuje z uchwytem magicznym

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 mecze zazwyczaj kompresować dobrze i loaddata może odczytywać skompresowane osprzętu. Aby skompresować urządzenie .bz2 bezpośrednio:

import bz2 

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