Импорт 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')