我有一个简单但令人沮丧的问题,我似乎无法弄明白。
我正在尝试将数据从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个模型实例。知道为什么会这样,我能做些什么来解决它?
非常感谢!
答案 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”),则后者非常有用。 ',等)