【问题标题】:Django - csv.reader and save()/updateDjango - csv.reader 和 save()/update
【发布时间】: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


【解决方案1】:

我用这个解决方案解决了。

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

                    try:

                        _, p = Excel1.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]})


                    except IntegrityError:
                        return render(request, 'testapp/duplicate_error.html', {'row' 
: row})

                return redirect('testapp:index')
    form = UploadFileForm()
    return render(
    request, "testapp/file_upload.html", {"form": form}
    )

【讨论】:

    猜你喜欢
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2011-09-19
    • 1970-01-01
    • 2012-05-19
    相关资源
    最近更新 更多