Skip to content

Instantly share code, notes, and snippets.

@ryu22e
Last active December 10, 2024 06:25
Show Gist options
  • Save ryu22e/364f8a923f970c7901e644527db8d2de to your computer and use it in GitHub Desktop.
Save ryu22e/364f8a923f970c7901e644527db8d2de to your computer and use it in GitHub Desktop.
Django CSV出力のちょっと面倒くさい話(1)
"""HttpResponseを使う場合"""
import csv
from django.contrib import admin
from django.http.response import HttpResponse
from .models import Book
def export_as_csv(modeladmin, request, queryset):
meta = modeladmin.model._meta
field_names = [field.name for field in meta.fields]
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = f'attachment; filename={meta.label_lower}.csv'
writer = csv.writer(response)
writer.writerow(field_names)
for obj in queryset:
writer.writerow([getattr(obj, field) for field in field_names])
return response
export_as_csv.short_description = "CSVエクスポート"
class BookAdmin(admin.ModelAdmin):
actions = (export_as_csv,)
admin.site.register(Book, BookAdmin)
"""StreamingHttpResponseを使う場合(大容量のファイルをダウンロードするならこちらが良い)"""
import csv
from django.contrib import admin
from django.http import StreamingHttpResponse
from .models import Book
class Echo:
def write(self, value):
return value
def _get_csv_rows(fields, queryset):
field_names = [field.name for field in fields]
yield field_names
for obj in queryset:
yield [getattr(obj, field) for field in field_names]
def export_as_csv(modeladmin, request, queryset):
meta = modeladmin.model._meta
pseudo_buffer = Echo()
writer = csv.writer(pseudo_buffer)
rows = _get_csv_rows(fields=meta.fields, queryset=queryset)
response = StreamingHttpResponse(
(writer.writerow(row) for row in rows),
content_type='text/csv',
)
response['Content-Disposition'] = f'attachment; filename={meta.label_lower}.csv'
return response
export_as_csv.short_description = "CSVエクスポート"
class BookAdmin(admin.ModelAdmin):
actions = (export_as_csv,)
admin.site.register(Book, BookAdmin)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment