在Django Admin中将csv数据导入数据库
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Django Admin中将csv数据导入数据库相关的知识,希望对你有一定的参考价值。
我试图通过调整管理员内部的模型形式将csv文件导入数据库:
models.朋友:
class Data(models.Model):
place = models.ForeignKey(Places)
time = models.DateTimeField()
data_1 = models.DecimalField(max_digits=3, decimal_places=1)
data_2 = models.DecimalField(max_digits=3, decimal_places=1)
data_3 = models.DecimalField(max_digits=4, decimal_places=1)
forms.朋友:
import csv
class DataImport(ModelForm):
file_to_import = forms.FileField()
class Meta:
model = Data
fields = ("file_to_import", "place")
def save(self, commit=False, *args, **kwargs):
form_input = DataImport()
self.place = self.cleaned_data['place']
file_csv = request.FILES['file_to_import']
datafile = open(file_csv, 'rb')
records = csv.reader(datafile)
for line in records:
self.time = line[1]
self.data_1 = line[2]
self.data_2 = line[3]
self.data_3 = line[4]
form_input.save()
datafile.close()
admin.朋友:
class DataAdmin(admin.ModelAdmin):
list_display = ("place", "time")
form = DataImport
admin.site.register(Data, DataAdmin)
但是我试图导入我放在“file_to_import”字段中的文件。在forms.py中获取AttributeError:'function'对象没有属性'FILES'。
我做错了什么?
经过长时间的搜索后,我找到了答案:使用标准表单在管理员中创建一个视图
形成:
class DataInput(forms.Form):
file = forms.FileField()
place = forms.ModelChoiceField(queryset=Place.objects.all())
def save(self):
records = csv.reader(self.cleaned_data["file"])
for line in records:
input_data = Data()
input_data.place = self.cleaned_data["place"]
input_data.time = datetime.strptime(line[1], "%m/%d/%y %H:%M:%S")
input_data.data_1 = line[2]
input_data.data_2 = line[3]
input_data.data_3 = line[4]
input_data.save()
风景:
@staff_member_required
def import(request):
if request.method == "POST":
form = DataInput(request.POST, request.FILES)
if form.is_valid():
form.save()
success = True
context = {"form": form, "success": success}
return render_to_response("imported.html", context,
context_instance=RequestContext(request))
else:
form = DataInput()
context = {"form": form}
return render_to_response("imported.html", context,
context_instance=RequestContext(request))
剩下的就是这篇文章的一部分:http://web.archive.org/web/20100605043304/http://www.beardygeek.com/2010/03/adding-views-to-the-django-admin/
看看django-admin-import
,它或多或少地完全符合您的要求 - 您可以上传XLS(不是CSV,但这不重要),并允许您将列分配给模型字段。还支持默认值。
http://pypi.python.org/pypi/django-admin-import/0.2.1
此外,它不会消除手动修改单个记录的可能性,因为您不必替换管理中使用的默认模型表单。
在save()
方法中,你没有对请求对象的任何访问权限 - 你可以看到它没有被传入。通常你会期望在那里有一个NameError
,但我怀疑你在文件的其他地方有一个函数叫request()
。
在保存时,所有相关数据都应该在cleaned_data
中:所以你应该能够做到
file_csv = self.cleaned_data['file_to_import']
那时你会遇到另一个问题,就是当你到达open
时 - 你不能这样做,因为file_to_import
不是服务器文件系统上的文件,它是一个从客户端流式传输的内存文件。你应该能够将file_csv
直接传递给csv.reader
。
以上是关于在Django Admin中将csv数据导入数据库的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中将 CSV 记录导入 MySQL 数据库
如何在windows的“omnidb”中将csv文件数据导入postgresql