Импорт CSV в БД с несколькими таблицами, отношения "один-ко-многим" - ищем хороший пример

Я использую пакет django-import-export для перемещения данных в и из моего приложения.

У меня есть плоский набор данных csv, который мне нужно импортировать. Каждая строка csv содержит поля, которые необходимо разобрать и импортировать во вторичную таблицу базы данных с отношением "один-ко-многим".

Я уже прочитал документацию django-import-export и раздел "рабочий процесс импорта данных", но я не смог найти хороший пример, который показывает импорт OnetoMany с несколькими таблицами - кажется, что стандартный пример каждого включает импорт данных в одну таблицу db - не полезно для моего сценария.

Вот пример моей модели данных.

#models.py

class SlateDoc(models.Model):

    #primary Model - fields not listed here.


class ActTimecodes(models.Model):

    #Secondary model - every slatedoc can have multiple instances of ActTimecodes

    slatedoc = models.ForeignKey(
              SlateDoc, 
              on_delete=models.CASCADE, 
             related_name="acts"
            )
    act_number = models.IntegerField(verbose_name="Act", default=1)
    tc_in = models.CharField(max_length=11, default="00:00:00:00")
    tc_out = models.CharField(max_length=11, default="00:00:00:00")
    dur = models.CharField(max_length=11, default="00:00:00:00")

    objects = ActTimecodesQuerySet.as_manager()

    class Meta:
        ordering = ["act_number", "tc_in", "tc_out"]

А вот пример данных CSV для импорта:

id filename int_house_num series_title episode_title producer act_01_in act_01_out act_02_in act_02_out act_03_in act_03_out act_04_in act_04_out act_05_in act_05_out act_06_in act_06_out act_01_dur act_02_dur act_03_dur act_04_dur act_05_dur act_06_dur
1 061846_Filename_2398p_EM.mov 061846 Cool Series The Quiet Place Mr.Pink 01:00:00:00 01:10:04:09 01:10:06:09 01:16:59:22 01:17:01:22 01:25:31:11 01:25:33:11 01:31:37:03 01:31:39:03 01:39:04:14 01:39:06:14 01:44:06:08 00:10:04:09 00:06:53:13 00:08:29:13 00:06:03:16 00:07:25:11 00:04:59:18

Каждую колонку с "act_X_in", "act_X_out", "act_X_dur" необходимо перевести в строку в модели ActTimecodes.

Так, для этого примера в модели ActTimecodes будет создано 6 строк для одного объекта SlateDoc.

Я предполагаю, что мне нужно написать пользовательский метод import_data()? Но не уверен, с чего начать, или есть ли еще какие-нибудь методы, которые нуждаются в настройке.

Если кто-нибудь может указать мне на пример, который иллюстрирует лучший подход для этого типа импорта, я буду очень признателен за помощь.

django-import-export имеет ряд методов, которые вы можете расширить для настройки импорта. Если вы определите ресурс с первичной моделью, то поля, которые соответствуют этой модели, будут импортированы как определенные.

Если у вас есть поля, которые находятся во вторичной модели, вы можете переопределить методы для извлечения, создания и сохранения этих объектов по мере необходимости.

Это становится сложнее, если вам нужно проверить, существуют ли уже существующие вторичные строки (и обновить их, если да), но основной принцип будет таким:

class SlateDocResource(resources.ModelResource):

    def after_import_row(self, row, row_result, row_number=None, **kwargs):
        # At this point, the primary object is persisted.
        # row data is stored in the 'row' dict.
        # you can dynamically iterate over the row to pull out values 
        # to create and save AclTimecodes instances
        pass


    class Meta:
        model = SlateDoc
        # you can define fields here as required - see docs
        fields = ('id', 'filename')
Вернуться на верх