【发布时间】:2019-06-17 23:12:42
【问题描述】:
我正在尝试通过重新上传具有更改值的 CSV 文件来更新我的数据库中的一个或多个字段。
我试过了:
views.py
def file_upload(request):
if request.method == "POST":
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
id = 0
das2 = CSV3.objects.all().values_list()
csv_file = request.FILES['file']
with open(str(csv_file)) as file:
reader = csv.reader(file)
for row in reader:
id += 1
try:
_, p = CSV3.objects.get_or_create(id = id, 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]})
except IntegrityError:
for i in das2:
i[1] = row[0]
i.save()
return redirect('appp:index')
form = UploadFileForm()
return render(
request, "appp/file_upload.html", {"form": form}
)
我遍历值并将值“gebaeudebereich”设置为 CSV 文件中的 gebaeudebereich 值(我也会对其他字段执行此操作,但这是我尝试过的想法)。它没有保存任何东西,也没有给我一个错误,只是没有做任何事情。 try 子句工作得很好。
我的模型.py
class CSV3(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"))
通过文件上传来更新数据库并不是那么困难。我希望你能帮助我,因为我试图解决这个问题太久了。
【问题讨论】:
-
您需要帮助自己进行一些调试。它在哪里失败?当它到达 get_or_create 时,它是获取还是创建?你捕捉到了 IntegrityErrors;是什么让您认为代码会引发这些错误?如果get_or_create的结果是get,你在哪里更新你收到的对象?
-
提示:你几乎肯定想使用
update_or_create而不是get_or_create。 -
您永远不会拥有
IntegrityError,因为get_or_create总是会成功。看看你的代码。 -
异常是因为我的 unique_together 约束,否则它会给我一个 IntegrityError(当然),所以我想通过更新字段来处理它。当我向我的文件添加一个条目时,它会创建一个新行,因此可以正常工作。 update_or_create 和 update() 在这种情况下没有帮助,因为我在这里了解到:(stackoverflow.com/questions/39915123/…) update 不会调用 save(),这就是我需要的。
-
所以我尝试迭代当前值,然后用新值覆盖它们,然后保存它们
标签: python django csv file-upload