使用django-import-export导入后如何获取已导入对象的实例?
你可以通过row_result参数的instance属性直接获取当前行导入后生成的Event实例。
为了避免行导入失败、被跳过时触发异常,建议先判断当前行的导入状态,确认导入成功后再执行后续会话创建逻辑。
修改后的完整代码如下:
from import_export.results import RowResult from django.utils import timezone from datetime import datetime, timedelta from import_export import resources, fields from .models import Event, EventSession class EventResource(resources.ModelResource): # 定义导入文件中存在但不属于Event模型的额外字段 start_date = fields.Field() start_time = fields.Field() minutes = fields.Field() sessions = fields.Field() def after_import_row(self, row, row_result, row_number=None, **kwargs): """ 行导入完成后,为刚保存的Event创建关联的EventSession """ # 跳过被跳过、导入出错的行 if row_result.import_type == RowResult.IMPORT_TYPE_SKIP or row_result.errors: return super().after_import_row(row, row_result, row_number=row_number,** kwargs) # 直接从row_result获取刚保存的Event实例 event = row_result.instance start_datetime = timezone.make_aware( datetime.combine(row["start_date"], row["start_time"]) ) end_datetime = start_datetime + timedelta(minutes=row["minutes"]) first_session = EventSession( event=event, start_date=start_datetime, end_date=end_datetime, ) first_session.save() for _ in range(1, row["sessions"]): # 会话按连续天生成 start_datetime = start_datetime + timedelta(days=1) end_datetime = end_datetime + timedelta(days=1) event_session = EventSession( event=event, start_date=start_datetime, end_date=end_datetime, ) event_session.save() return super().after_import_row( row, row_result, row_number=row_number, **kwargs ) class Meta: model = Event fields = ( "id", "title", ) skip_unchanged = True report_skipped = True
内容的提问来源于stack exchange,提问作者Webucator
相关产品推荐
相关产品推荐

