Как использовать call_command с командой dumpdata для сохранения json в файл
Я пытаюсь использовать 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 ответа
Пришлось перенаправить 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
Еще лучший способ - использовать встроенное перенаправление stdout в 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())
Приспособления DB обычно хорошо сжимаются, и loaddata
умеет читать сжатые данные Написать .bz2
сжатый крепеж напрямую:
import bz2
with bz2.BZ2File('db.json.bz2', 'w', buffering=1024) as f:
django.core.management.call_command('dumpdata', stdout=f)
Я использую магию приспособлений Django https://github.com/davedash/django-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"
Это одна помощь для нескольких данных дампа в файл 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')