如何使用 call_command 和 dumpdata 命令将 json 保存到文件
Posted
技术标签:
【中文标题】如何使用 call_command 和 dumpdata 命令将 json 保存到文件【英文标题】:How to use call_command with dumpdata command to save json to file 【发布时间】:2013-04-11 03:28:52 【问题描述】:我正在尝试使用call_command
方法调用转储数据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')
有没有办法像我们在命令行中那样将给定的数据保存到文件中?
【问题讨论】:
【参考方案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
【讨论】:
谢谢阿米思。这是我在管理操作中使用 django-fixture-magic 执行 custom_dump 时必须使用的。【参考方案2】:一个更好的方法是使用 Django 的内置标准输出重定向他们的命令模块。见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())
【讨论】:
我认为create_fixture
可以简化:with open(filename, 'w') as f: management.call_command('dumpdata', app_name, stdout=f)
同意@AurélienGâteau,但如果您打算从 Python 3 开始使用 StringIO 进行拦截,请确保将 cStringIO
替换为 io
【参考方案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"
【讨论】:
【参考方案4】: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)
【讨论】:
【参考方案5】:这有助于将多个数据转储到 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')
【讨论】:
以上是关于如何使用 call_command 和 dumpdata 命令将 json 保存到文件的主要内容,如果未能解决你的问题,请参考以下文章
apache-Pig map-reduce group by error