2013-04-18 9 views
9

call_commandメソッドを使用して、dumpdataを呼び出そうとしていますcommand。手動では、データをファイルに保存するために次のように使用します。dump_ataコマンドでcall_commandを使用して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

10

もっと良い方法は、コマンドモジュールにDjangoの組み込み標準出力リダイレクトを使用することです。 docs hereを参照してください。

ファイルに送信する前に、ストリームを操作したい場合は、あなたもそれをのStringIOバッファを渡すことができます。私はhttps://github.com/davedash/django-fixture-magic魔法Djangoのフィクスチャを使用して、カスタム・フィクスチャをダンプする必要があるのです

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'を簡略化することができると思います:open(filename、 'w')をf:management.call_command( 'dumpdata'、app_name、stdout = f) –

2

。私はいくつかの方法を試みましたが、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) 
関連する問題