You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:45:33