0

djangoオブジェクトのフィールドにアクセスするためのテンプレートのような構文を使用して、CSVファイル(または任意の適切なエクスポート形式)のデータを生成したいと思います。たとえば、出力フィールドの仕様は次のようになります。

employee.id
employee.manager.first_name
employee.user.last_login
employee.contact.phone_number

DjangoまたはJinja2テンプレートで使用するのと同じ構文を使用してフィールドが指定されている場合。

また、django / jinjaテンプレートの場合と同じように、フィルターを使用できるようにしたいと思います。

employee.user.last_login|date:"c"

この仕様とオブジェクトのリストを前提として、オブジェクトからデータの行を生成したいと思います。次に、このデータからCSV、XMLなどを生成できます。

私はこれを行う何かを書き始めましたが、それはすぐに複雑になり、おそらくDjango/Jinja2テンプレートエンジンの既存の部分を使用できると思います。

Django / Jinja2構文を介してオブジェクトにアクセスできるものはありますか?

4

2 に答える 2

1

まず、モジュール以外の手法で CSV データを生成しても、csv多くの友人を獲得することはできません。それは仕事に適したツールです。

そのモジュールで出力を生成する最も便利writer.writerows()な方法は、ネストされたリスト (またはシーケンスの反復子) を取る を使用することです。ジェネレーターは、まさにそれを表現する良い方法です。

def csv_spec(queryset):
    for employee in queryset:
        yield (
            employee.id,
            employee.manager.first_name,
            employee.user.last_login,
            employee.contact.phone_number)

w = csv.writer(outfile)
w.writerows(csv_spec(something))

編集:つまり、テンプレートを使用するのと同じ理由でテンプレートのようなものが必要だと言っていますが、テキストの代わりに CSV を生成します。完全なテンプレートがなくても、プレースホルダーにある種類の式を解析して処理するように jinja に依頼できます。

いくつかのデータがあると仮定します:

>>> from collections import namedtuple
>>> from datetime import datetime
>>> Employee = namedtuple('Employee', 'id manager user contact')
>>> Person = namedtuple('Person', 'first_name last_name')
>>> Account = namedtuple('Account', 'username password last_login')
>>> Contact = namedtuple('Contact', 'phone_number email')
>>> data = [
...     Employee(0, Person('Alice', 'Brown'),
...              Account('abrown', 'secret', datetime(2013, 3, 3)),
...              Contact('5551234', 'abrown@example.com')),
...     Employee(1, Person('Bob', 'Jones'),
...              Account('bjones', 'safe', datetime(2013, 3, 3)),
...              Contact('5555678', 'bjones@example.com')),
...     Employee(2, Person('Carol', 'Smith'),
...              Account('csmith', 'hidden', datetime(2013, 3, 3)),
...              Contact('5559012', 'csmith@example.com'))]

およびテンプレート (これをファイルから簡単に読み取ることができます)

>>> import StringIO
>>> template = StringIO.StringIO('''employee.id
... employee.manager.first_name
... employee.user.last_login
... employee.contact.phone_number''')

式コンパイラを使用するには、環境が必要です。オプションを指定する必要はありません:

>>> import jinja2
>>> env = jinja2.Environment()
>>> template_filter = map(env.compile_expression, template)

前述したように、csv モジュールを使用します。

>>> import csv
>>> import sys
>>> writer = csv.writer(sys.stdout)

最後に、コンパイルされた式を使用して、一度に 1 行ずつデータを実行し、各行に各式を適用できます。

>>> writer.writerows([[field(employee=row) for field in template_filter]
...                   for row in data])
0,Alice,2013-03-03 00:00:00,5551234
1,Bob,2013-03-03 00:00:00,5555678
2,Carol,2013-03-03 00:00:00,5559012
于 2013-02-22T04:00:25.117 に答える
0

Django Docs は優れたリソースです - http://docs.python.org/2/library/csv.html

知っておく必要があるのは、Python でオブジェクト プロパティにアクセスするために使用されるドット表記だけです。

于 2013-02-22T01:51:34.183 に答える