2013-04-18 50 views
9

我正在嘗試使用call_command方法調用dumpdata command。手動,我使用它如下將數據保存到文件。如何使用call_command和dumpdata命令將json保存到文件

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

它保存了json文件。現在,我處於需要使用call_command方法調用此命令的情況。

我能夠用打印出該命令的JSON如下:

from django.core.management import call_command 

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

有沒有一種方法,我可以給出的數據保存到一個文件,就像我們在命令行做呢?

回答

11

不得不將sys.stdout重定向到該文件以實現上述目的。就像是。

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

謝謝Amyth。這是我在使用django-fixture-magic在管理操作中執行custom_dump時必須使用的。 – wilblack 2014-07-30 17:10:40

10

更好的方法是在他們的命令模塊中使用Django的內置stdout重定向。請參閱docs here

如果你想將其發送到文件之前,操作流,你也可以傳遞一個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

我認爲可以簡化'create_fixture':打開(filename,'w')作爲f:manage.call_command('dumpdata',app_name,stdout = f) – 2015-05-18 13:33:26

2

我使用Django夾具魔法https://github.com/davedash/django-fixture-magic和需要傾倒定製夾具。我嘗試了幾種方法,但最終使用了Amyth的答案,因爲這是唯一可行的方法。

這裏是我的管理行爲,與夾具神品

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燈具一般壓縮得很好,並且loaddata可以讀取壓縮裝置。直接寫一個.bz2壓縮夾具:

import bz2 

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