如何将call_command与dumpdata命令一起使用以将json保存到文件中

时间:2013-04-18 06:16:57

标签: django json command call dumpdata

我正在尝试使用call_command方法调用dumpdata command。我手动将其用于将数据保存到文件中。

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')

有没有办法可以将命令行中的给定数据保存到文件中?

5 个答案:

答案 0 :(得分:14)

必须将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 :(得分:12)

更好的方法是使用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())

答案 2 :(得分:2)

我正在使用Django fixture magic 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"

答案 3 :(得分:0)

数据库夹具通常压缩良好,"C:/Users/xorex/Documents/Spirit-master/config/config5.xml"; 可以读取压缩夹具。直接编写loaddata压缩夹具:

.bz2

答案 4 :(得分:0)

此帮助将多个数据转储到json文件中

from django.core.management import call_command
import sys


sys.stdout = open('app_one/fixtures/apple.json', 'w')
call_command('dumpdata', 'app_one.apple')

sys.stdout = open('app_two/fixtures/banana.json', 'w')
call_command('dumpdata', 'app_two.banana')