1

DjangoビューでCSVファイルを生成することに関して、すでにいくつかのスレッドがありますが、私の状況に本当に合っている(そして私のために働く)ものはありません。

エンド ユーザー向けに一種の , クエリ ビルダーを作成したため、クエリセットに含まれるフィールドを選択できます。そのため、選択されるフィールドはクエリごとに異なる可能性があるため、「ハード-テーブルの見出しなどをコーディングします。

私のモデル.py

class Customers(models.Model):
    firstname = models.CharField(max_length=100)
    middlename = models.CharField(max_length=100)
    lastname = models.CharField(max_length=100)
    nickname = models.CharField(max_length=100)    

基本的に、1 つの辞書と、クエリセットを構築する 2 つの配列があります。これは、request.POST を通じて取得されます。

customers = Customers.objects.all().filter(**filargs).order_by(*ordargs).values(*selargs)

たとえば、エンド ユーザーが「firstname」フィールドと「lastname」フィールドのみを選択したい場合、次のような CSV を生成したいとします。

First Name    Last Name
John          Johnson
Ted           Samson

Django のドキュメントから見たように、次のコードを使用して行を作成できます

writer.writerow(['First Name','Last Name'])

ただし、クエリセットで選択されるフィールドはクエリごとに異なる可能性があるため、これを動的に行う方法が必要です。以下を試してみましたが、うまくいかないようでした。

writer.writerow(selargs)  << selargs being my select field list

実際のレコード (フィールド名ではない) の書き込みに関しては、次のようなことを試みましたが、得られた出力は明らかに間違っていました。

for customer in customers:
    for value in customer:
        writer.writerow(value)

しかし、ご想像のとおり、これにより、各レコードのすべてのフィールド値に対して個別の行が得られました。ある種の「write.writecell」またはそれらの線に沿った何かがありますか?

助けていただければ幸いです。これには簡単な解決策があると確信しています。

ありがとう、

4

1 に答える 1

1

以下は、Django クエリセットを取り込み、CSV ファイルを吐き出します。

使用法::

utils import dump2csv から

dummy_app.models インポートから *

qs = DummyModel.objects.all()

dump2csv.dump(qs, './data/dump.csv')

スクリプト:

import csv
from django.db.models.loading import get_model

def dump(qs, outfile_path):

    model = qs.model
writer = csv.writer(open(outfile_path, 'w'))

headers = []
for field in model._meta.fields:
    headers.append(field.name)
writer.writerow(headers)

for obj in qs:
    row = []
    for field in headers:
        val = getattr(obj, field)
        if callable(val):
            val = val()
        if type(val) == unicode:
            val = val.encode("utf-8")
        row.append(val)
    writer.writerow(row)
于 2013-08-06T14:29:39.243 に答える