使用Django import-export从杂志页导出多对多关联的订阅数据
解决方案
可以直接借助django-import-export自带的能力实现,无需自定义admin动作,步骤如下:
1. 定义订阅数据的导出资源
创建Subscription对应的ModelResource,指定需要导出的字段:
from import_export import resources from .models import Subscription class SubscriptionResource(resources.ModelResource): class Meta: model = Subscription fields = ('user__id', 'magazine__id', 'signed_up_on', 'active') export_order = ('user__id', 'magazine__id', 'signed_up_on', 'active')
2. 修改杂志管理后台配置
让MagazineAdmin继承ImportExportActionModelAdmin,并重写两个关键方法,替换导出的资源和查询集:
from django.contrib import admin from import_export.admin import ImportExportActionModelAdmin from .models import Magazine, Subscription from .resources import SubscriptionResource # 假设你已定义订阅的内联配置 class SubscriptionInline(admin.TabularInline): model = Subscription extra = 0 @admin.register(Magazine) class MagazineAdmin(ImportExportActionModelAdmin): inlines = [SubscriptionInline] # 保留你原有的其他MagazineAdmin配置 def get_export_resource_class(self, request): # 指定导出用Subscription的资源,而非Magazine的 return SubscriptionResource def get_export_queryset(self, request): # 获取选中的杂志,返回对应的所有订阅记录 selected_ids = request.POST.getlist(admin.ACTION_CHECKBOX_NAME) return Subscription.objects.filter(magazine_id__in=selected_ids)
说明
- 这个方案直接复用
django-import-export自带的导出动作,无需编写自定义admin动作代码 - 重写
get_export_queryset后,导出的是选中杂志对应的所有订阅记录,自然每条订阅占一行,完全符合需求 - 避开了你之前遇到的问题:无需依赖
SubscriptionResource的get_queryset(库不会提前填充不符合需求的查询集),也不用ManyToManyWidget拼接内容
内容的提问来源于stack exchange,提问作者breadjesus
相关产品推荐
相关产品推荐

