Last active
December 10, 2024 06:25
-
-
Save ryu22e/364f8a923f970c7901e644527db8d2de to your computer and use it in GitHub Desktop.
Django CSV出力のちょっと面倒くさい話(1)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""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) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""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