Django - загрузка нескольких файлов CSV без переопределения - PullRequest
0 голосов
/ 14 февраля 2019

Есть ли способ использовать 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-файле, но не обновить в БД.

...