私は大きなファイルをモデルに挿入する必要があるプロジェクト(時には数ギガバイト)に取り組んでいます。ファイルが大きくなる可能性があるので、私が取っているアプローチは、それを線で読み取ってからDjangoモデルに挿入することです。モデルに大きなデータセットを挿入するDjango - コミットを遅延させる方法
ただし、プロセスでエラーが発生した場合、どのように操作全体をキャンセルするのですか?ファイル全体がエラーなしで処理された後に行がコミットされるようにする適切な方法は何ですか。
もう1つの方法は、すべてのモデルオブジェクトを一度に作成して一括して挿入することです。大規模なデータセットの場合はこれが可能ですか?どのように動作するのでしょうか。
は、ここに私のコードです:
class mymodel(models.Model):
fkey1 = models.ForeignKey(othermodel1,on_delete=models.CASCADE)
fkey2= models.ForeignKey(othermodel2,on_delete=models.CASCADE)
field 1= models.CharField(max_length=25,blank=False)
field 2= models.DateField(blank=False)
...
Field 12= models.FloatField(blank=False)
やExcelからモデルにデータを挿入:私は難しく見えているはず
wb=load_workbook(datafile, read_only=True, data_only=True)
ws=wb.get_sheet_by_name(sheetName)
for row in ws.rows:
if isthisheaderrow(row):
#determine column arrangement and pass to next
break
for row in ws.rows:
if isthisheaderrow(row):
pass
elif isThisValidDataRow(row):
relevantRow=<create a list of values>
dictionary=dict(zip(columnNames,relevantRow))
dictionary['fkey1']=othermodel1Object
dictionary['fkey2']=othermodel2Object
mymodel(**dictionary).save()
はちょうどそれが[コンテキストマネージャ]としても使用できることに留意されたい(https://docs.djangoproject.com/en/ 1.11/topics/db/transactions /#制御トランザクション - 明示的に)( 'with transaction.atomic():')、コードをラップするだけの関数を作成する必要はありません。 – Anonymous
優秀、ありがとう! –