Django在模型中插入大型数据集-如何延迟提交?

Django在模型中插入大型数据集-如何延迟提交?,django,django-models,Django,Django Models,我正在做一个项目,需要在模型中插入大文件(有时是几GB)。因为文件可能很大,所以我采用的方法是逐行读取,然后将其插入Django模型 但是,当过程中遇到错误时,如何取消整个操作?确保在处理完整个文件后提交行不会出错的正确方法是什么 另一种方法是一次性创建所有模型对象并批量插入,这对大型数据集可行吗?它将如何工作 这是我的密码: class mymodel(models.Model): fkey1 = models.ForeignKey(othermodel1,on_delete=mode

我正在做一个项目,需要在模型中插入大文件(有时是几GB)。因为文件可能很大,所以我采用的方法是逐行读取,然后将其插入Django模型

但是,当过程中遇到错误时,如何取消整个操作?确保在处理完整个文件后提交行不会出错的正确方法是什么

另一种方法是一次性创建所有模型对象并批量插入,这对大型数据集可行吗?它将如何工作

这是我的密码:

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()
wb=load\u工作簿(数据文件,只读=True,仅数据=True)
ws=wb。通过名称(sheetName)获取工作表
对于ws.rows中的行:
如果是此标题错误(行):
#确定立柱布置并传递到下一个
打破
对于ws.rows中的行:
如果是此标题错误(行):
通过
elif isThisValidDataRow(世界其他地区):
相关行=
dictionary=dict(zip(列名称,相关行))
字典['fkey1']=其他模型1对象
字典['fkey2']=其他Model2对象
mymodel(**字典).save()

我应该更仔细一点,提交可能会被装饰程序
@transaction.atomic
延迟。此处给出了更详细的说明:

守则如下:

wb=load_workbook(trfile, read_only=True, data_only=True)
ws=wb.get_sheet_by_name(sheetName)
revenueSwitch=True
for row in ws.rows:
    if ifHeaderReturnIndex(row,desiredColumns):
        selectedIndex=ifHeaderReturnIndex(row, desiredColumns)
        outputColumnNames=[row[i].value.replace(" ", "") for i in selectedIndex]
        #output_ws.append(outputColumnNames)
        break
@transaction.atomic
def insertrows():
    for row in ws.rows:
        if ifHeaderReturnIndex(row,desiredColumns):
            pass
        elif isRowValid(row,selectedIndex):
            newrow=[row[i].value for i in selectedIndex]
            dictionary=dict(zip(outputColumnNames,newrow))
            dictionary['UniqueRunID']=run
            dictionary['SourceFileObject']=TrFile
            TransactionData(**dictionary).save()
insertrows()            

请注意,它还可以用作(
with transaction.atomic():
)的函数,因此不需要创建一个函数来包装一些代码。