18

我正在尝试使用该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')

有没有办法像我们从命令行那样将给定的数据保存到文件中?

4

5 回答 5

23

必须重定向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
于 2013-04-18T06:36:41.073 回答
17

一个更好的方法是使用 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())
于 2013-12-09T20:40:58.373 回答
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"
于 2014-07-30T17:15:46.483 回答
2

DB 夹具通常可以很好地压缩,并且loaddata可以读取压缩的夹具。直接写一个.bz2压缩的fixture:

import bz2

with bz2.BZ2File('db.json.bz2', 'w', buffering=1024) as f:
  django.core.management.call_command('dumpdata', stdout=f)
于 2017-06-19T14:55:22.933 回答
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')
于 2020-04-22T18:02:36.790 回答