Django后台数据导出格式转换实战
在Django项目中,后台数据导出是一个常见需求。本文将介绍如何在Django Admin中实现多种格式的数据导出功能。
基础导出功能实现
首先,我们需要在Admin中添加导出按钮。创建一个自定义的ModelAdmin类:
# admin.py
from django.contrib import admin
from django.http import HttpResponse
import csv
import json
from .models import Product
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ['name', 'price', 'category']
def export_csv(self, request):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="products.csv"'
writer = csv.writer(response)
writer.writerow(['名称', '价格', '分类'])
for product in self.get_queryset(request):
writer.writerow([product.name, product.price, product.category])
return response
def export_json(self, request):
products = []
for product in self.get_queryset(request):
products.append({
'name': product.name,
'price': str(product.price),
'category': product.category
})
response = HttpResponse(json.dumps(products, ensure_ascii=False), content_type='application/json')
response['Content-Disposition'] = 'attachment; filename="products.json"'
return response
export_csv.short_description = "导出CSV"
export_json.short_description = "导出JSON"
actions = [export_csv, export_json]
高级格式转换功能
对于更复杂的需求,我们可以使用第三方库django-import-export:
pip install django-import-export
# admin.py
from import_export.admin import ImportExportModelAdmin
from import_export import resources
class ProductResource(resources.ModelResource):
class Meta:
model = Product
fields = ('id', 'name', 'price', 'category')
@admin.register(Product)
class ProductAdmin(ImportExportModelAdmin):
resource_class = ProductResource
list_display = ['name', 'price', 'category']
自定义导出视图
如果需要更灵活的控制,可以创建自定义视图:
# views.py
from django.http import JsonResponse, HttpResponse
from django.views.decorators.csrf import csrf_exempt
import pandas as pd
@csrf_exempt
def export_data(request):
if request.method == 'POST':
format_type = request.POST.get('format', 'json')
# 获取数据
queryset = Product.objects.all()
data = [
{
'id': item.id,
'name': item.name,
'price': float(item.price),
'category': item.category
}
for item in queryset
]
if format_type == 'csv':
df = pd.DataFrame(data)
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="export.csv"'
df.to_csv(response, index=False)
return response
elif format_type == 'xlsx':
df = pd.DataFrame(data)
response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename="export.xlsx"'
df.to_excel(response, index=False)
return response
else:
return JsonResponse({'data': data})
部署配置
在生产环境中,建议使用异步任务处理大数据导出:
# tasks.py
from celery import shared_task
import pandas as pd
@shared_task
def export_large_dataset(model_name, format_type='csv'):
# 处理大量数据的导出逻辑
pass
通过以上方法,可以在Django后台实现灵活的数据导出功能,满足不同格式转换需求。

讨论