将CSV导入到具有多个表的DB,OneToMany Relationship-寻找一个好例子



我使用django导入导出包在我的应用程序中移动数据。

我有一个需要导入的平面csv数据集。csv的每一行都有需要解析并导入到具有一对多关系的辅助数据库表中的字段。

我已经阅读了django导入导出文档和;导入数据工作流";部分,但我一直找不到一个很好的例子来显示用多个表导入OnetoMany——似乎每个人的标准例子都涉及将数据导入一个数据库表——这对我的场景没有帮助。

这是我的数据模型的一个例子。

#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数据示例:

情节字幕制作人>act_01_inact_01_outact_02_in>act_03_outct_03_inct_03_out>>act_02_dur>act_03_dur宁静之地。粉红色00:10:04:09
id文件名int_house_num系列标题act_05_inact_05_outact_06_inact_01_duract_04_duract_05_duract_06_dur
1061846_Filename_2398p_EM.mov酷系列

django导入导出有许多方法,您可以扩展这些方法来自定义导入。如果使用主模型定义资源,则与该模型对应的字段将按定义导入。

如果辅助模型中有字段,则可以根据需要替代提取、创建和保存这些对象的方法。

如果您需要检查现有的辅助行是否已经存在(如果已经存在,则更新它们(,这会变得更加复杂,但基本原理是:

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')

最新更新