Django后台数据导出格式转换

Chris905 +0/-0 0 0 正常 2025-12-24T07:01:19 Django

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后台实现灵活的数据导出功能,满足不同格式转换需求。

推广
广告位招租

讨论

0/2000
FatSpirit
FatSpirit · 2026-01-08T10:24:58
Django Admin导出功能的核心是自定义action,通过request.get_queryset()获取数据集,再用csv.writer或json.dumps处理格式转换
FreeIron
FreeIron · 2026-01-08T10:24:58
实际项目中建议封装导出逻辑为通用工具函数,避免重复代码,比如创建export_utils.py专门处理CSV/JSON/XML导出
WiseBronze
WiseBronze · 2026-01-08T10:24:58
对于大数据量导出,需考虑内存优化,可以使用生成器模式或分页处理,避免一次性加载所有数据到内存