1

モデル情報をcsvファイルにエクスポートするために、次のcsvエクスポート機能があります。しかし、モデル内の関数からの出力を表示する方法を理解しようとしています。そのため、csv エクスポート関数は、モデル内のすべてのフィールド (テーブル内のフィールド) を表示しますが、モデル内の関数からの出力は表示しません..

したがって、次のものがあれば:

def avg_tag(self, obj):
    bids = Bid.objects.active(user=obj.user.id)
    return bids.aggregate(average_price=Avg('list_price'))['average_price']

モデルで

その関数からの出力は得られません。

csv エクスポート関数のアクションは次のとおりです。

def export_select_fields_csv_action(description="Export selected objects",
                     fields=None, exclude=None, header=True):
def export_as_csv(modeladmin, request, queryset):
    """
    Generic csv export admin action.
    based on http://djangosnippets.org/snippets/1697/
    """
    opts = modeladmin.model._meta
    field_names = [field.name for field in opts.fields]
    labels = []
    if exclude:
        field_names = [v for v in field_names if v not in exclude]
    elif fields:
        field_names = [k for k, v in fields if k in field_names]
        labels = [v for k, v in fields if k in field_names]

    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = ('attachment; filename=%s.csv'
        % unicode(opts).replace('.', '_'))

    writer = csv.writer(response)
    if header:
        if labels:
            writer.writerow(labels)
        else:
            writer.writerow(field_names)
    for obj in queryset:
        writer.writerow([unicode(getattr(obj, field)).encode('utf-8')
            for field in field_names])
    return response
export_as_csv.short_description = description
return export_as_csv

モデル内の関数からの出力がcsvで出力されるように、上記の関数を変更するにはどうすればよいですか? ありがとう!

4

1 に答える 1

1

クエリセットをループするビットを編集して、最後に追加するだけだと思います-

for obj in queryset:
    writer.writerow([unicode(getattr(obj, field)).encode('utf-8')
        for field in field_names] + "," + obj.avg_tag())

必要な見出しを追加するのと同様のことを行うことができます-

if header:
    if labels:
        writer.writerow(labels + "," + "Average Tag")
    else:
        writer.writerow(field_names + "," + "Average Tag"))

アップデート

モデルには定義していないメソッドがたくさんあることがわかるので、フィールドとメソッドを取得するのは少し難しいでしょう(そしておそらくcsvには入れたくないでしょう)。必要なものと不要なものを区別する簡単な方法はありません。

そこに何があるかを確認するために、以下を試してみてください-

import inspect
obj = modeladmin.model()
methods = [a for a in dir(modeladmin.model) if inspect.ismethod(getattr(obj, a))]
for method in methods:
    print str(method)

私は確かにこれを行うためのエレガントな方法を見ることができません(または実際にはとにかく)-実際に各メソッドを指定する必要があると思います。

于 2013-02-22T19:27:50.373 に答える