如何使用call_command与dumpdata命令保存JSON到文件(How to use ca

2019-08-31 11:13发布

我试图用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')

有没有一种方法,我可以给出的数据保存到一个文件,就像我们在命令行做呢?

Answer 1:

不得不重定向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


Answer 2:

一个更好的方法是使用Django的内置标准输出重定向他们的指挥模块。 见文档这里 。

如果你想将其发送到文件之前,操作流,你也可以传递一个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())


Answer 3:

我使用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"


Answer 4:

DB灯具一般压缩得很好,并且loaddata可以读取压缩装置。 要编写.bz2直接压缩夹具:

import bz2

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


文章来源: How to use call_command with dumpdata command to save json to file