Django Admin如何导出含外键关联的多模型数据为SQL/CSV/JSON
Django Admin 关联模型列表数据导出方法
你在Admin列表页展示的跨多模型关联数据,完全支持导出为CSV、JSON、SQL格式,之前两种方案没生效是配置不到位导致的,对应解决方法如下:
修正django-import-export配置导出全量字段
django-import-export默认只会导出当前模型的本地字段,不会自动拉取外键关联表内容,你只需要自定义Resource类显式声明关联字段即可,不需要额外换工具:
- 新建对应Accidents模型的Resource类,把所有跨表关联字段按双下划线跨表取值的规则声明,和你Admin列表展示的字段一一对应
- 示例配置代码:
from import_export import resources, fields from .models import Accidents class AccidentsResource(resources.ModelResource): # 声明关联字段,取值逻辑和Admin里的自定义方法对齐 get_location = fields.Field(attribute='id_loc__name_loc', column_name='位置名称') get_municipality = fields.Field(attribute='id_loc__id_mun__name_m', column_name='所属市镇') get_district = fields.Field(attribute='id_loc__id_mun__id_d__name_d', column_name='所属区域') get_cf = fields.Field(attribute='id_loc__id_cf__acs_name', column_name='CF标识') show_images_url = fields.Field(attribute='imagesurl_acc', column_name='图片地址') class Meta: model = Accidents # 列出所有需要导出的字段,顺序和list_display保持一致即可 fields = ('id_acc', 'text_acc', 'date_acc', 'source_acc', 'victimnb_acc', 'injurednb_acc', 'type_acc', 'category_acc', 'get_location', 'get_cf', 'get_municipality', 'get_district', 'show_images_url') export_order = fields
- 在原有AccidentsAdmin类中添加配置项
resource_classes = [AccidentsResource],重启服务后导出功能就会自动拉取所有关联字段内容,和页面展示的数据完全匹配。该配置原生支持CSV、JSON格式导出,需要SQL格式的话可以基于导出的JSON/CSV做简单转换,也可以自定义导出格式类实现直接导出SQL。
注意:如果关联字段存在空值,在Field定义中添加
default=''参数即可避免导出时报错。另外show_images_url字段直接取原始链接值即可,不需要保留方法里的HTML a标签结构,避免导出文件出现冗余代码。
SQL视图导出实现
你创建的SQL视图完全支持导出,只需要给视图配置对应的Django映射模型即可:
- 定义模型时指定
managed = False,db_table参数填写你创建的SQL视图名称 - 把视图返回的所有列按对应数据类型在模型中定义,不需要额外配置外键、主键关系
- 给这个映射模型注册Admin并搭配django-import-export配置,就可以和普通模型一样导出视图的全量行数据。如果你的联表逻辑比较复杂,用视图的方式导出性能会比ORM跨表联查更高。
内容的提问来源于stack exchange,提问作者Ali J. Ghandour
相关产品推荐
相关产品推荐

