2013-04-18 29 views
9

Tôi đang cố gắng sử dụng phương thức call_command để gọi bãi chứa dữ liệu command. Theo cách thủ công, tôi sử dụng nó như sau để lưu dữ liệu vào một tệp.Cách sử dụng lệnh call_command với lệnh dumpdata để lưu json vào tập tin

python manage.py dumpdata appname_one appname_two > /path/to/save/file.json 

và lưu tệp json. Bây giờ, tôi đang ở trong một tình huống mà tôi cần phải gọi lệnh này bằng cách sử dụng phương pháp call_command.

tôi có thể in ra json từ lệnh bằng cách sử dụng sau đây:

from django.core.management import call_command 

call_command('dumpdata', 'appname_one', 'appname_two') 

Có cách nào tôi có thể lưu dữ liệu cho một tập tin như chúng tôi làm điều đó từ dòng lệnh?

Trả lời

11

phải chuyển hướng sys.stdout vào tệp để đạt được mục tiêu trên. Cái gì đó như.

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 
+1

Cảm ơn Amyth. Đây là những gì tôi đã phải sử dụng khi sử dụng django-fixture-magic để làm một custom_dump trong một hành động admin. – wilblack

10

Một cách tốt hơn nữa là sử dụng chuyển hướng cài sẵn trong Django cho các mô-đun lệnh của họ. Xem docs here.

Nếu bạn muốn thao tác các dòng trước khi gửi nó vào một tập tin, bạn cũng có thể vượt qua nó một bộ đệm 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()) 
+1

Tôi nghĩ rằng 'create_fixture' có thể được đơn giản hóa: với mở (tên tập tin, 'w') là f: management.call_command ('dumpdata', app_name, stdout = f) –

2

Tôi đang sử dụng Django cố kỳ diệu https://github.com/davedash/django-fixture-magic và cần phải đổ một vật cố tùy chỉnh. Tôi đã thử nhiều cách nhưng kết thúc bằng cách sử dụng câu trả lời của Amyth vì đó là cách duy nhất hoạt động.

Đây là hành động quản trị của tôi làm việc với vật cố kỳ diệu

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" 
0

DB đồ đạc thường nén tốt, và có thể đọc loaddata đồ đạc nén. Để viết trực tiếp .bz2 vật cố nén:

import bz2 

with bz2.BZ2File('db.json.bz2', 'w', buffering=1024) as f: 
    django.core.management.call_command('dumpdata', stdout=f) 
Các vấn đề liên quan