【问题标题】:How do you get the instance of the imported object after importing with django-import-export?使用 django-import-export 导入后如何获取导入对象的实例?
【发布时间】:2021-10-26 21:36:23
【问题描述】:

我正在尝试在使用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 start_date start_time minutes sessions
9/1/21 10:00 60 2
9/8/21 10:00 60 3

我的 ModelResource 类

我正在尝试覆盖 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-admin django-import-export


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    【解决方案2】:

    我想出了一个解决方案。我可以通过覆盖after_save_instance() 将实例保存为EventResource 对象的属性。

    def after_save_instance(self, instance, using_transactions, dry_run):
        self.instance = instance
        return super().after_save_instance(instance, using_transactions, dry_run)
    

    然后在after_import_row(),我使用:

    event = self.instance
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-05
      • 2022-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 2020-04-22
      相关资源
      最近更新 更多