Есть ли способ использовать update_or_create для множественной загрузки файлов из разных файлов?
Так что сейчас я могу загрузить CSV-файл в мою базу данных sqlite3.Если я изменю файл csv, записи в базе данных будут обновлены без проблем.Но сейчас я пытаюсь добавить записи из другого файла CSV.При моем текущем подходе я перезаписываю записи в базе данных, потому что я проверяю только идентификатор.Я пытаюсь добавить записи другого файла в мою текущую базу данных без необходимости копировать записи в исходную.
Вот мой models.py
class CSV5(models.Model):
gebaeudebereich = models.CharField(max_length=100)
gebaeudenummer = models.CharField(max_length=100)
ebene = models.CharField(max_length=100)
raum = models.CharField(max_length=100)
dose = models.CharField(max_length=100)
switch_ip = models.CharField(max_length=100)
switch_port = models.CharField(max_length=100)
datum = models.CharField(max_length=100)
akteur = models.CharField(max_length=100)
class Meta:
unique_together = (("gebaeudebereich", "gebaeudenummer", "ebene", "raum", "dose"), ("switch_ip", "switch_port"))
Вот мой файлФункция загрузки:
if request.method == "POST":
form = UploadFileForm(request.POST, request.FILES)
updated_obj = 0
created_obj = 0
duplicate_obj = 0
count = 0
if form.is_valid():
csv_file = request.FILES['file']
with open(str(csv_file)) as file:
reader = csv.reader(file)
for row in reader:
count += 1
try:
datet = datetime.now().date()
datum = datet.strftime("%d.%m.%Y")
row[7] = datum
row[8] = str(request.user)
_, p = CSV5.objects.update_or_create(id = count,
defaults={'gebaeudebereich': row[0],
'gebaeudenummer': row[1],
'ebene': row[2], 'raum': row[3],
'dose': row[4],
'switch_ip': row[5],
'switch_port': row[6],
'datum': row[7], 'akteur': row[8]})
if p:
created_obj += 1
print("created: ", created_obj)
else:
updated_obj += 1
print("updated: ", updated_obj)
except IndexError:
break
except IntegrityError:
duplicate_obj += 1
print("duplicates: ", duplicate_obj)
count -= 1
pass
messages.success(request, "objects created: %s " % created_obj)
messages.success(request, "objects updated: %s " % updated_obj)
messages.success(request, "duplicate objects: %s " % duplicate_obj)
return redirect('appp:index')
form = UploadFileForm()
return render(
request, "appp/file_upload.html", {"form": form}
)
Вот два CSV-файла (сокращенно):
a.csv:
25,41,1,23,12,1,A01,07.11.2017,test
25,41,1,22,13,2,A02,07.11.2018,test
25,41,1,23,14,3,A03,07.11.2018,test
25,41,1,23,15,4,A04,07.11.2018,test
b.csv:
19,34,1,23,12,1,A01,07.11.2017,test
19,34,1,22,13,2,A02,07.11.2018,test
19,34,1,23,14,3,A03,07.11.2018,test
19,34,1,23,15,4,A04,07.11.2018,test
Так что сейчас загрузки из одного файла работают.Когда я проверяю поля модели плюс идентификатор, я получаю ошибку целостности для каждого поля из-за моего ограничения unique_together (я думаю) и когда я проверяю поля модели без идентификатора, загрузка из другого файла работает, но когда яобновить поле в любом CSV-файле, но не обновить в БД.