12

私はdjangoとPythonにかなり慣れていないので、モデル内のアイテムのリスト、つまり製品をエクスポートできるようにしたいと考えています。ここでドキュメントを見ています-https://docs.djangoproject.com/en/dev/howto/outputting-csv/

必要なすべてのデータを格納する変数を作成する必要があると思います。ただし、上記のリンクのコードスニペット内のどこにあるかはわかりません。

申し訳ありませんが、これは非常にわかりにくい質問ですが、実際には何の助けにもなりません。

これまでの私のスクリプトのコードは次のとおりです。

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"'
4

10 に答える 10

17

pythoncsvモジュールを見てください。

モデルフィールドを次のように取得することをお勧めします

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

次に、

getattr(instance, field.name)

フィールド値を取得します(この質問のように)。

次に、次のようなものが必要になります

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)

それは少し冗長です(そしてテストされていません)が、それはあなたにアイデアを与えるはずです。(ああ、ファイルを閉じるのを忘れないでください)

于 2013-02-22T17:14:33.820 に答える
14

シナリオによっては、モデルのCSVが必要になる場合があります。Django管理サイトにアクセスできる場合は、リストとして表示されている任意のモデルの一般的なアクションをプラグインできます(google:django adminアクション)

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

コンソール(python manage.py ...)を使用している場合は、次のようなスクリプトを使用できます。

(次の場所に配置します:yourapp / management / Commands / 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
于 2013-05-20T20:27:17.560 に答える
3

フォーマットに役立つテンプレートを作成することもできます。

テンプレートは一般的な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
于 2013-02-22T17:47:49.397 に答える
3

私は自分のコードでこれを使用しています。ビューから呼び出される関数。モデルフィールドを自動的に取得して列を作成します。エクスポートするフィールドリストをカスタマイズすることもできます。

働き

import csv

from django.http import HttpResponse

from .models import Books


def export_qs_to_csv(model_class = None, qs = None, field_names = None):
    if model_class and not qs:
        qs = model_class.objects.all()
    if qs and not model_class:
        model_class = qs.model

    meta = model_class._meta
    if not field_names:
        field_names = [field.name for field in meta.fields]

    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta)
    writer = csv.writer(response)

    writer.writerow(field_names)
    for obj in qs:
        row = writer.writerow([getattr(obj, field) for field in field_names])

    return response

使用法

@user_passes_test(lambda u: u.is_superuser)
def export_books(request):
    return export_qs_to_csv(model_class = Books)
    # or
    return export_qs_to_csv(qs = Books.objects.filter(published = True))
    # or
    return export_qs_to_csv(
        qs = Books.objects.filter(published = True),
        field_names = [
            "title",
            "price",
            "publishing_date",
        ]
        )

元の回答

これは機能し、 model_class変数でモデルクラスを定義するだけで済みます。このDjangoビューでは、ダウンロードCSVを使用できます。CSV名はDjango_app.model_name.csvです。

import csv

from django.http import HttpResponse

from .models import Trade


def export_to_csv(request):
    # The only line to customize
    model_class = Trade

    meta = model_class._meta
    field_names = [field.name for field in meta.fields]

    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta)
    writer = csv.writer(response)

    writer.writerow(field_names)
    for obj in model_class.objects.all():
        row = writer.writerow([getattr(obj, field) for field in field_names])

    return response
于 2019-01-09T23:38:08.503 に答える
3

django.db.models.query.QuerySet.valuesを使用すると、私のユースケースに対してより最適化されたクエリが得られます。

import csv
from datetime import datetime

from django.http import HttpResponse

# Populate this list with your model's fields
# Replace MODEL with your model
fields = [f.name for f in MODEL._meta.fields]

# The following code will live inside your view
timestamp = datetime.now().isoformat()

response = HttpResponse(content_type="text/csv")
response[
    "Content-Disposition"
] = f"attachment; filename={timestamp}.csv"
writer = csv.writer(response)

# Write the header row
writer.writerow(fields)

# Replace MODEL with your model
for row in MODEL.objects.values(*fields):
    writer.writerow([row[field] for field in fields])

return response
于 2019-10-28T09:52:38.563 に答える
1

@ tomasz-gandorの回答に基づいていますが、2020年に更新された潜在的な解決策は次のとおりです。

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

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


class Command(BaseCommand):
    help = ("Output the specified model as CSV")


    def add_arguments(self, parser):
        parser.add_argument('model',
                            nargs=1,
                            type=str,
                            help='Model name to export, like <app.model> or "members.Member"')
        parser.add_argument('outfile',
                            nargs=1,
                            type=str,
                            help='Save path, like </path/to/outfile.csv> or "/data/members.csv"')


    def handle(self, *app_labels, **options):
        from django.apps import apps
        app_name, model_name = options['model'][0].split('.')
        model = apps.get_model(app_name, model_name)
        field_names = [f.name for f in model._meta.fields]
        writer = csv.writer(open(options['outfile'][0], 'w'), quoting=csv.QUOTE_ALL, delimiter=',')
        writer.writerow(field_names)
        for instance in model.objects.all():
            writer.writerow([str(getattr(instance, f)) for f in field_names])

簡単に使用できます:

python manage.py model2csv members.Member /data/members_export.csv

于 2020-06-30T23:35:20.527 に答える
0

いくつかのデータを本番環境からインポートし、途中で変更する必要があったため、以前の回答のいくつかを組み合わせました。これが私の解決策です。これを使用して、CSVファイルの書き込み中にいくつかのフィールド値を上書きできます。

クエリセットデータをCSVファイルにエクスポートします。

import csv

from myapp.models import MyModel
from user.models import User

# Make some queryset manually using Django shell:
user = User.objects.get(username='peterhil')
queryset = MyModel.objects.filter(user=user)

def query_to_csv(queryset, filename='items.csv', **override):
    field_names = [field.name for field in queryset.model._meta.fields]
    def field_value(row, field_name):
        if field_name in override.keys():
            return override[field_name]
        else:
            return row[field_name]
    with open(filename, 'w') as csvfile:
        writer = csv.writer(csvfile, quoting=csv.QUOTE_ALL, delimiter=',')
        writer.writerow(field_names)  # write the header
        for row in queryset.values(*field_names):
            writer.writerow([field_value(row, field) for field in field_names])

# Example usage:
query_to_csv(queryset, filename='data.csv', user=1, group=1)
于 2020-08-03T11:46:50.680 に答える
0

モデルcsvファイルにこのソリューションを使用してください。役立つ場合があります

 # Create the HttpResponse object with the appropriate CSV header.
 response = HttpResponse(content_type='text/csv')
 response['Content-Disposition'] = 'attachment; 
 filename="somefilename.csv"'
 writer = csv.writer(response);
 writer.writerow(["username","Email"]);
 for i in User.objects.all():
     writer.writerow([i.username,i.email])
 return response
于 2020-08-20T08:16:17.130 に答える
0

フィールド名を気にせず、すべてのフィールドが必要な場合は、これを実行してください。

with open('file_name.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    for obj in YourModel.objects.values_list():
        row = list(obj)
        writer.writerow(row)
于 2020-12-14T07:49:16.067 に答える
0

django-queryset-csvパッケージを使用しました。

次の手順を実行します:

  1. pip install django-queryset-csv

  2. あなたのviews.py:

import djqscsv
from products.models import Product

def get_csv(request):
    qs = Product.objects.all()
    return djqscsv.render_to_csv_response(qs)
于 2021-05-03T16:18:26.347 に答える