Как использовать 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')
Другие вопросы по тегам