ich erstelle grad ein Programm welches einen CSV-Upload bereitstellt. Der Upload funktioniert im Grunde auch ganz gut (ich benutze hierfür die Django Funktion create()). Wenn ich nun einen Wert in der CSV-Datei änder, würde ich gerne beim erneuten Upload die derzeitigen Werte in der Datenbank mit den neuen überschreiben. Ich habe versucht die Django Funktion Model.objects.filter().update() zu verwenden , allerdings ohne Erfolg. Die Option die alte Tabelle zu löschen und die neue hochzuladen muss ich ausschließen auch wenn diese Möglichkeit im Grunde am einfachsten ist.
Für den Upload benutze ich den csv.reader, der die Datei zeilenweise einliest.
Hier ist mein Code für den Upload.
views.py
[/code]
Code: Alles auswählen
def file_upload(request):
if request.method == "POST":
form = UploadFileForm(request.POST, request.FILES)
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
ds1 = Excel1.objects.filter(id = count).values_list().exists()
#print("TEst", ds1)
try:
if not ds1:
_, p = Excel1.objects.create(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])
#print("Test2")
else:
_, h = Excel1.objects.filter(id = count).update(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])
except IntegrityError:
continue
return redirect('testapp:index')
form = UploadFileForm()
return render(
request, "testapp/file_upload.html", {"form": form}
)
Code: Alles auswählen
class Excel1(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'))
meine Form Klasse
Code: Alles auswählen
class UploadFileForm(forms.Form):
file = forms.FileField()