如何从 django 中可用的大量 csv 文件中选择一个 csv 文件

Posted

技术标签:

【中文标题】如何从 django 中可用的大量 csv 文件中选择一个 csv 文件【英文标题】:How to choose a csv file from a number of csv files available in django 【发布时间】:2021-02-09 10:46:37 【问题描述】:

我对 django 和 python 还是很陌生。 我在 django 项目的应用程序中有许多具有相同格式的不同 csv 文件。我想使用项目(网站)的超链接选择一个特定的文件。 我怎样才能做到这一点? 还有其他方法吗?

【问题讨论】:

请解释“我想使用项目(网站)的超链接选择特定文件”的意思。您想将文件作为静态文件提供,还是希望有人能够将 CSV 文件上传到您的网站? 我的项目中有 10 个 csv 文件(具有不同的数据但相同的元数据)。我想通过链接选择这些文件中的任何一个。我怎样才能做到这一点?是否需要以文件名结尾的网站链接(这可能听起来很荒谬)或其他内容? 如果文件附加到模型中,您可以使用模型的pk结尾的url来访问模型 @nihilok 他们没有附加模型,但我可以做到。你能解释更多或一些链接。 【参考方案1】:

除了静态文件方法之外,为了回应要求更多信息的评论,

如果你这样创建model:

class CSVFile(models.Model):
    file = models.FileField(upload_to='csv_files/')

然后您可以通过 django 管理员或以编程方式上传文件,并通过您的视图将模型实例作为上下文传递,例如

def view(request):
    files = CSVFile.objects.all()      
    return render(request, 'template.html, 'files': files)

然后您可以有第二个视图来下载文件:

def download(request, pk):
    csv = CSVFile.objects.filter(pk=pk).first()
    filename = csv.file.name.split('/')[-1]
    response = HttpResponse(csv.file, content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename=%s' % filename
    return response

然后在urls.py中:

urlpatterns = [
    path('', views.view, name='home'),
    path('file/<int:pk>', views.download, name='download'),
]

然后在模板中:

<body>
  <h1>Download your CSVs!</h1>
  % for file in files %
    <p><a href="% url 'download' pk=file.pk %"><button type="button">Download  file.file.name </button></a></p>
  % endfor %
</body>

看起来像这样:

最后一件事,在将文件保存到模型之前,请在 settings.py 中设置媒体根目录,如下所示:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

查看更多关于字段here 并一直向下滚动到/搜索 FileField,here 用于管理模型中的文件

【讨论】:

嘿@nihilok 感谢您的帮助。你能告诉如何在views.py中打开这个(file = CSVFile.objects.filter(id=?).first()) csv文件。我找不到这个解决方案。 这取决于你想用它做什么。如果它在 python 代码中,你可能根本不需要使用 'django' 方法。如果您只想从模板访问文件,我将在我的答案中添加一些更具体的示例【参考方案2】:

您在问如何提供静态文件。详情请阅读documentation。 如果您在离线服务器上执行此操作,您只需定义 Django 可以在项目设置页面上找到静态资产(文件夹名称)的位置。为此,您可以将STATIC_URL = '/static/' 放入您的设置中,然后将所有 csv 文件放入名为static 的文件夹中,该文件夹应位于项目的根目录中。然后,您可以使用 %static% 标签访问您的文件并获取它们的 URL。对于部署,您还需要在设置中定义 STATIC_ROOT

如果您需要在生产环境中提供静态文件,您可以使用 whitenoise 之类的内容以方便使用。

【讨论】:

以上是关于如何从 django 中可用的大量 csv 文件中选择一个 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

从 S3 存储桶中读取大量 CSV 文件

如何使用 csv.DictReader 在 django 中上传和读取 csv 文件?

从 django 应用程序下载一个文本/csv 文件,该文件从数据库查询中填充 HTML 表

如何将 Django 模型数据导出到 CSV 文件中

如何从 Perl 快速访问许多大型 CSV 文件中的数据?

如何从 pyspark 数据框中更快地保存 csv 文件?