将数据从csv文件加载到Django模型中

时间:2016-08-08 03:13:36

标签: django python-2.7 csv django-models

我有一个简单但令人沮丧的问题,我似乎无法弄明白。

我正在尝试将数据从csv文件加载到Django模型中。为此,我将以下脚本编写为视图:

import csv
def import_db(request):
    dataReader = csv.reader(open('/home/<name>/webapps/<name2>/employees.csv'), delimiter=',', quotechar='"')
    for row in dataReader:
        emp = Employee()
        emp.first_name = row[0]
        emp.last_name = row[1]
        emp.email = row[2]
        emp.level = row[3]
        emp.service_area = row[4]
        emp.service_line = row[5]
        emp.office = row[6]
        emp.save()
return HttpResponse("Completed", content_type="text/plain")

我已将视图链接到网址,如下所示:

from reviews import views as emp  
url(r'^load/$',   emp.import_db, name='importdb')

我的想法是,当我访问链接sitename.com/load时,我的数据将从employee.csv文件加载到我的Employee模型中。

问题是当我运行这个脚本时,我的Django模型中为我的csv文件中的每一行输入了两个条目。我在csv中有1530个员工行,当我这样做时,模型会填充3060个实例。更令人讨厌的是,模型中条目的顺序与csv文件不同,所以我不能简单地删除1530模型实例的第二个“组”。即使我在csv文件中使用20行数据的子集进行尝试,也会得到40个模型实例。知道为什么会这样,我能做些什么来解决它?

非常感谢!

3 个答案:

答案 0 :(得分:2)

在视图函数中执行此逻辑不是一个好主意。我不确切知道为什么在你的情况下,但是可以两次触发相同的视图功能(例如,谷歌浏览器等浏览器通常会在将它们粘贴到地址栏后在后台预取URL - 这可以导致这种观点出现两次点击。我不知道这是否是问题,但可能值得排除。

您应该考虑将此逻辑移动到可以确定性调用的custom management command。类似的东西:

# myapp/management/commands/import_csv.py
from django.core.management.base import BaseCommand, CommandError


class Command(BaseCommand):

    def add_arguments(self, parser):
        parser.add_argument('csv_file', nargs='+', type=str)

    def handle(self, *args, **options):
        for csf_file in options['csv_file']:
            dataReader = csv.reader(open(csv_file), delimiter=',', quotechar='"')
            for row in dataReader:
                emp = Employee()
                # etc...
                self.stdout.write(
                    'Created employee {} {}'.format(emp.first_name, emp.last_name)
                )

然后你会用:

来调用它
./manage.py import_csv --csvfile "/home/<name>/webapps/<name2>/employees.csv"

这种方法可以让您更好地控制正在发生的事情,并且可以更容易地调试问题(如果还有的话)。

答案 1 :(得分:1)

在打开文件的位置,检查行数是这样的:

    reader = csv.reader(open('/home/<name>/webapps/<name2>/employees.csv'), delimiter=',', quotechar='"')
    data = list(reader)
    print len(data) # check this

答案 2 :(得分:0)

如果您只希望管理员能够导入文件,而不希望应用程序用户导入,则可以使用django-import-export。 这是一个小部件,可让您从管理部分导入excel文件。

阅读docs
在这里找到installation tutorial,在这里找到expample

与实施自定义管理命令相比,它非常易于安装并且更加用户友好。如果您想在将数据插入数据之前先对其进行“标准化” /“预格式化”(例如统一字符“”,“ e”或“ a”或“ o”),则后者非常有用。 ',等)