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

在Django Admin中使用django-import-export导入行后如何获取ID?

解决Django Import-Export导入后无法获取实例ID的问题

你遇到的问题核心在于:after_import_row里的row对象只包含导入时的原始数据,新实例的ID是数据库自动生成的,在数据写入前不会出现在row里。不过django-import-export给我们提供了更直接的方式——通过row_result参数就能拿到刚创建/更新的实例,自然就能获取到ID了。

具体修改步骤:

  1. 替换实例获取方式:放弃用row['id']查询,直接从row_result.object提取已保存的实例。
  2. 修正代码笔误:你的代码最后写的recipient.save()应该是my_class.save(),这个小错误也得改过来。
  3. 优化Admin的import_data方法:你重写的方法里硬编码了dry_run=False,建议传递方法接收到的参数,避免覆盖原有逻辑。

修改后的完整代码如下:

class OtherResource(resources.ModelResource):
    """ My code """
    def after_import_row(self, row, row_result, **kwargs):
        # 直接从row_result获取已保存的实例,自带数据库生成的ID
        my_class = row_result.object
        my_class.first_name = 'some new'
        my_class.save()  # 修正笔误:把recipient改为my_class

class MyClassAdmin(ImportMixin, admin.ModelAdmin):
    resource_class = OtherResource
    
    def import_data(self, dataset, dry_run=False, raise_errors=False, use_transactions=None, collect_failed_rows=False, **kwargs):
        """ Getting the user's request to pass it to the import """
        # 传递接收到的参数,而非硬编码固定值
        result = OtherResource.import_data(
            dataset, 
            dry_run=dry_run, 
            raise_errors=raise_errors, 
            use_transactions=use_transactions,
            user=self.request.user,
            **kwargs
        )
        return result

补充说明:

  • 如果是新增行:row_result.object就是刚插入数据库的实例,已经带有自动生成的ID。
  • 如果是更新现有行:row_result.object会是数据库中已存在的实例,同样能直接获取到ID。
  • 要是你需要在数据写入数据库前处理逻辑,可以用before_import_row方法,但如果要操作已保存的实例,after_import_row配合row_result.object是最稳妥的方式。

内容的提问来源于stack exchange,提问作者Samir Hinojosa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:33:53