将CSV文件中的数据存储到数据库中

时间:2017-06-03 10:29:47

标签: python django csv

我有一个宿舍的Django模型,其中一个字段FileUpload,我将从中获取一个CSV文件并填充数据库,我一直在尝试过去两天搜索如何做到这一点,但无法正常工作 这个how to import csv data into django models问题有效但只有我有文件的路径,我尝试了很多方法但没有成功。在那之后我尝试更加努力地搜索How do I get a files absolute path after being uploaded in Django?我看到了这一点,但即便如此,我也无法让它工作,因为它显示了一些错误

我使用了这个URL映射 url(r'^test/$',views.FileUpload.as_view(),name="test")

但是它显示了一些命名空间错误。 请告诉我该怎么做,如果你有一些建议我应该怎么重新开始,我感到很失落。 我想从用户那里获取一个文件,然后填充数据库

可以这样做(How do I transfer data in .csv file into my sqlite database in django?)就好像我们可以创建一个带有接受csv的文件字段的表单然后通过解析填充数据库,问题就是我们无法对路径进行硬编码。那我们该怎么做呢。

EDIT 的 views.py

from django.views import View
class FileUpload(View):
    def post(self, request):
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            initial_obj = form.save(commit=False)
            data=initial_obj['document']
            with open((data),'rb') as csvfile:
                spamreader = csv.reader(csvfile)
                for row in spamreader:
                    _, created=Document.objects.get_or_create(
                    name=row[0],
                    description = row[1],
                    importance=row[2],
                    )

            initial_obj.save()
            form.save()
            return redirect('/')
        else:
            return render(request,'file_upload_form.html',{'form':form})

    def get(self, request):
        return render(request, 'file_upload_form.html', {'form': form,})

forms.py

class DocumentForm(forms.ModelForm):
    class Meta:
        model = Document
        fields = ('description', 'document', )

models.py

class Document(models.Model):
    name=models.CharField(max_length=50,blank=True)
    description=models.CharField(max_length=255, blank=True)
    importance=models.CharField(max_length=10, default="High")
    document = models.FileField(upload_to='documents/')
    uploaded_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.description

我没有收到任何错误,但它没有从CSV文件中保存数据库中的数据,并将我重定向到必须完成上传的同一页面,并显示文档字段的错误“此字段是必需的”。

更新:我解决了问题更多详情here

1 个答案:

答案 0 :(得分:0)

您可以轻松覆盖表单的clean()方法,并将自定义数据内容保存到数据库中

 def clean(self):
    super(DocumentForm, self).clean()
    import csv
    with open((self.cleaned_data['file']), 'rb') as csvfile:
    spamreader = csv.reader(csvfile)
    for row in spamreader:
        // DO WHATEVER YOU WANT