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