首页 > 解决方案 > 使用 django-import-export 导入后如何获取导入对象的实例?

问题描述

在使用django-import-export 导入后,我正在尝试将对象添加到相关模型中。

我的模特

class Event(models.Model):
    title = models.CharField(max_length=150)

class EventSession(models.Model):
    event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name="sessions")
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()

我的导入数据

ID 开始日期 开始时间 分钟 会话
21 年 9 月 1 日 10:00 60 2
21 年 9 月 8 日 10:00 60 3

我的模型资源类

我试图覆盖after_import_row以获取导入的事件,然后创建事件会话,但我不知道如何获取导入的事件。

class EventResource(resources.ModelResource):

    start_date = fields.Field()
    start_time = fields.Field()

    def after_import_row(self, row, row_result, row_number=None, **kwargs):
        """ After importing the row, get the saved event and save the event sessions."""
        
        event = get_instance() # HOW TO GET THE 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"]):
            # Sessions are always consecutive days
            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",
            "start_date",
            "start_time",
            "sessions",
        )
        skip_unchanged = True
        report_skipped = True

标签: django-admindjango-import-export

解决方案


您还可以按如下方式获取实例 ID:

def after_import_row(self, row, row_result, row_number=None, **kwargs):
    print(row_result.object_id)

显然,如果需要,您可以加载该对象。

另一种方法是覆盖after_import(). 在这种情况下,result传递给方法的对象 contains rows,它是所有导入行的列表。

def after_import(self, dataset, result, using_transactions, dry_run, **kwargs):
    for row_result in result:
        print(row_result.object_id)

推荐阅读