在Django Admin中使用django-import-export导入行后如何获取ID?
解决Django Import-Export导入后无法获取实例ID的问题
你遇到的问题核心在于:after_import_row里的row对象只包含导入时的原始数据,新实例的ID是数据库自动生成的,在数据写入前不会出现在row里。不过django-import-export给我们提供了更直接的方式——通过row_result参数就能拿到刚创建/更新的实例,自然就能获取到ID了。
具体修改步骤:
- 替换实例获取方式:放弃用
row['id']查询,直接从row_result.object提取已保存的实例。 - 修正代码笔误:你的代码最后写的
recipient.save()应该是my_class.save(),这个小错误也得改过来。 - 优化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
相关产品推荐
相关产品推荐

