首页 > 解决方案 > CSV 到 Django 中的数据库

问题描述

我正在从upload form我的网站上接收数据,我想将数据插入到Database. 在views.py我使用这个代码

def upload(request):
    data = {}
    if "GET" == request.method:
        return render(request, "main/upload.html", data)
    # if not GET, then proceed

    csv_file = request.FILES["csv_file"]
    if not csv_file.name.endswith('.csv'):
        messages.error(request,'File is not CSV type')
        return HttpResponseRedirect(reverse("main:upload"))
        #if file is too large, return
    if csv_file.multiple_chunks():
        messages.error(request,"Uploaded file is too big (%.2f MB)." % (csv_file.size/(1000*1000),))
        return HttpResponseRedirect(reverse("main:upload"))

    file_data = csv_file.read().decode("utf-8")
    lines = file_data.split("\n")
        #io_string = io.StringIO(data_set)
        #print(io_string.getvalue())
        #next(io_string)
    for line in lines:
        column = line.split(",")
        data_dict = {}
        data_dict["顧客CD"]=column[0],
        data_dict["顧客補助CD"]=column[1],
        data_dict["顧客名称1"]=column[2],
        data_dict["顧客名称"]=column[3],
        data_dict["顧客名称カナ"]=column[4],
        data_dict["法人名称"]=column[5],
        data_dict["代表者名称"]=column[6],
        data_dict["住所"]=column[7],
        data_dict["電話番号"]=column[8],
        data_dict["地区名称"]=column[9],
        data_dict["データマッチ用電話番号"]=column[10],
        data_dict["契約状態"]=column[11]
        form = kokyaku(data_dict)
        form.save()

    return HttpResponseRedirect(reverse("main:upload"))

而在models.py

from djongo import models
from django.utils import timezone
from django.contrib.auth.models import User

class kokyaku(models.Model):
    顧客CD = models.IntegerField(blank=True)
    顧客補助CD = models.IntegerField(blank=True)
    顧客名称1 = models.TextField(blank=True)
    顧客名称 = models.TextField(blank=True)
    顧客名称カナ = models.TextField(blank=True)
    法人名称 = models.CharField(max_length=15, blank=True)
    代表者名称 = models.CharField(max_length=15, blank=True)
    住所 = models.TextField(blank=True)
    電話番号 = models.IntegerField(blank=True)
    地区名称 = models.TextField(blank=True)
    データマッチ用電話番号 = models.IntegerField(blank=True)
    契約状態 = models.CharField(max_length=2, blank=True)

    def __str__(self):
        return self.顧客名称

如您所见,我正在尝试将列 from viewstomodels与 python's进行“匹配” dict,但是models我试图将其作为变量获取,因此我的程序会引发错误消息: int() argument must be a string, a bytes-like object or a number, not 'dict'但我不确定如何更改能够传递信息dictmodels格式或更改格式以使其models能够处理此问题

标签: pythondjangopython-3.x

解决方案


您可以简单地尝试对它们进行类型转换,而不是为每个实例保存表单,您可以像这样将实例添加到数据库中。(即使 for 也可以,只要确保正确地对它们进行类型转换,并且 int() 中没有奇怪的字符串)

for line in lines:
        column = line.split(",")
        kokyaku.objects.create(顧客CD = column[0], 顧客補助CD = int(column[1]),顧客名称1=str(column[2]), 顧客名称=str(column[3]), 顧客名称カナ=str(column[4]), 法人名称=str(column[5]), 代表者名称=str(column[6]),住所=str(column[7]), 電話番号=str(int(column[8])),地区名称=str(column[9]),データマッチ用電話番号=int(column[10]),契約状態=str(column[11]))

要直接导入数据,您可能需要查看tablib库。它具有有用且高效的工具。特别是在 django 中,您可以使用django-import-export它们与 tablib 配合得很好。


推荐阅读