如何使用call_command命令与dumpdata命令将JSON保存到文件中

22

我正在尝试使用call_command方法调用dumpdata命令。手动地,我将其用作以下方式将数据保存到文件中。

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个回答

28

我需要将 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

20

更好的方法是使用Django的内置stdout重定向功能,用于其命令模块。请参见此处文档

如果您想在将流发送到文件之前对其进行操作,还可以将其传递给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())

6
我认为create_fixture可以简化:使用with open(filename, 'w') as f:打开文件后,运行management.call_command('dumpdata', app_name, stdout=f) - Aurélien Gâteau
同意@AurélienGâteau的观点,但如果您确实打算在Python 3中使用StringIO进行拦截,请确保将cStringIO替换为io - Marc
还有 management.call_command('dumpdata', app_name, '-o', filename) - am70

3

数据库固定数据通常可以很好地压缩,loaddata 可以读取压缩的固定数据。要直接编写 .bz2 压缩的固定数据:

import bz2

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

3
我正在使用Django Fixture Magic (https://github.com/davedash/django-fixture-magic),需要导出自定义Fixture。我尝试了几种方法,最终采用了Amyth的答案,因为这是唯一可行的方法。
以下是我的Admin操作与Fixture Magic配合使用:
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

这个可以帮助将多个数据转储到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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接