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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:27:02