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

Amy*_*yth 14 django json command call dumpdata

我试图使用该call_command方法来调用dumpdata command.手动,我按如下方式使用它将数据保存到文件中.

python manage.py dumpdata appname_one appname_two > /path/to/save/file.json
Run Code Online (Sandbox Code Playgroud)

它保存了json文件.现在,我处于需要使用该call_command方法调用此命令的情况.

我可以使用以下命令从命令打印出json:

from django.core.management import call_command

call_command('dumpdata', 'appname_one', 'appname_two')
Run Code Online (Sandbox Code Playgroud)

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

Amy*_*yth 18

不得不重定向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
Run Code Online (Sandbox Code Playgroud)


mga*_*bed 12

更好的方法是使用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())
Run Code Online (Sandbox Code Playgroud)

  • 我认为`create_fixture`可以简化:用open(filename,'w')as f:management.call_command('dumpdata',app_name,stdout = f) (3认同)