2013-02-22 10 views
6

DjangoとPythonの新機能で、モデル内のアイテム、つまり製品のリストをエクスポートしたいと考えています。私はここのドキュメンテーションを見ています - https://docs.djangoproject.com/en/dev/howto/outputting-csv/モデルからCSVにアイテムをエクスポートするDjango/Python

私は必要です私が必要とするすべてのデータを格納する変数を作成する必要があるでしょう。しかし、上のリンクのコードスニペットのどこにそれがあるのか​​は分かりません。

これは非常に嫌な質問ですが、本当にどんなヘルプでもあります。ここで

は、これまでの私のスクリプトのコードです:

import csv 

from products.models import Product 

from django.http import HttpResponse 


def export_to_csv(request): 
    response = HttpResponse(content_type='text/csv') 
    response['Content-Disposition'] = 'attachment; filename="mytest.csv"' 

答えて

10

python csv moduleを見てください。

おそらく、その後(this質問のように)フィールドの値を取得するために

getattr(instance, field.name) 

を使用

def get_model_fields(model): 
    return model._meta.fields 

でモデルのフィールドを取得したいと思います。

その後、あなたはそれは冗長(未検証)ビットだ

with open('your.csv', 'wb') as csvfile: 
    writer = csv.writer(csvfile) 
    # write your header first 
    for obj in YourModel.objects.all(): 
     row = "" 
     for field in fields: 
      row += getattr(obj, field.name) + "," 
     writer.writerow(row) 

ような何かをしたいでしょうが、それはあなたのアイデアを与える必要があります。 (ああ、あなたのファイルを閉じることを忘れないでください)

+0

"obj._meta.get_all_field_names(フィールド用):"。もう少し簡潔かもしれない。 –

2

フォーマットを支援するテンプレートを作ることもできます!

テンプレートは、シナリオに応じて、共通のDjangoテンプレート

from django.template import loader 
def export_to_csv(request): 
    response = HttpResponse(mimetype='text/csv') 
    response['Content-Disposition'] = 'attachment; filename="products-list.csv"' 
    template = loader.get_template('templates/products_template.csb') 
    response.write(template.render(Context({'products': Products.objects.all()}))) 
    return response 
12

です - あなたは、モデルのCSVを持っている場合があります。 python manage.py ...(コンソールで動作している場合

http://djangosnippets.org/snippets/790/

:(管理者のアクションをジャンゴグーグル)あなたはDjangoの管理サイトへのアクセスを持っている場合は、リストとして表示されたモデルのための一般的なアクションをプラグインすることができます)、私はちょうど使用されるそのようなスクリプトを使用することができます

を(に置く:yourapp /管理/コマンド/ model2csv.py)

""" 
Prints CSV of all fields of a model. 
""" 

from django.core.management.base import BaseCommand, CommandError 
import csv 
import sys 

class Command(BaseCommand): 
    help = ("Output the specified model as CSV") 
    args = '[appname.ModelName]' 

    def handle(self, *app_labels, **options): 
     from django.db.models import get_model 
     app_name, model_name = app_labels[0].split('.') 
     model = get_model(app_name, model_name) 
     field_names = [f.name for f in model._meta.fields] 
     writer = csv.writer(sys.stdout, quoting=csv.QUOTE_ALL) 
     writer.writerow(field_names) 
     for instance in model.objects.all(): 
      writer.writerow([unicode(getattr(instance, f)).encode('utf-8') for f in field_names]) 

これは、すべての例外などをキャッチしませんが、管理者としてそれらを引き起こさない育てる、そう?

が好き、それを使用してください:

あなたが使用することができますが見つかり
./manage.py model2csv my_ecommerce.Product > products.csv 
+0

属性の1つが外部キーである場合、動作していないようです。そのような属性については、 'id unknown'の形式の値を取得しています。ここで' id'は外部キーの値です(例えば '1未知 ')。私にとってうまくいくのは 'field_names = [model._meta.fieldsのfのためのf.attname]'です。 – silentser

+0

クエリセットでselect_relatedを使うことをお勧めします。外部キーをお持ちの場合は、たくさんのSQLクエリがあります。例えばmodel.objects.all()の中で です。field_namesのfのためのencode( 'utf-8')) '' {{unicode(getattr(instance、f) – maykel

関連する問題