django - 在 django 视图中手动更新模型的 FileField
问题描述
我有一个 csv 文件存储在模型的 FileField 中。我想从 csv 文件中删除选定的列并更新存储在项目的 FileField 中的文件。
我已成功从模型中检索文件并将其存储到 Pandas DataFrame 中。选定的列已成功从数据框中删除,但未能更新存储在项目的 FileField 中的文件。
这是我的模型:
class Project(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
base_file = models.FileField(upload_to='project-files', default=True)
date_created = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
这是假设通过 pandas 数据框操作文件的视图:
def PreprocessView(request, **kwargs):
proj_pk = kwargs.get('pk')
project = Project.objects.get(id=proj_pk)
df = pd.read_csv(project.base_file)
n_cols = df.keys
context ={}
context['df'] = df
context['n_cols'] = n_cols
if request.method == 'POST':
checked_values = request.POST.getlist(u'predictors')
str_check_values = ', '.join(checked_values)
df.drop(columns=checked_values, inplace=True)
new_df = df.to_csv(project.base_file.name)
project.base_file = new_df
project.save()
messages.success(request, f'{str_check_values} has been successfuly removed!')
return render(request, 'projects/preprocess/preprocess.html', context)
以下行返回错误并且无法更新数据库中的文件。
new_df = df.to_csv(project.base_file.name)
project.base_file = new_df
project.save()
解决方案
您必须创建一个文件对象,然后将其附加到模型。像这样
from django.core.files.base import ContentFile
if request.method == 'POST':
checked_values = request.POST.getlist(u'predictors')
str_check_values = ', '.join(checked_values)
df.drop(columns=checked_values, inplace=True)
new_df = df.to_csv()
updated_file = ContentFile(new_df)
updated_file.name = "filename.csv"
project.base_file = updated_file
project.save()
推荐阅读
- python - 如何使用 Keras 作为高级 API 在 tensorflow 上实现批量标准化
- batch-file - 批处理脚本中的外部 If 条件导致错误
- c# - httpWebRequest 在 c# Visual Studio 2010 中结合 xml & string & integer key values 和 contenettype = application/json 发布
- c# - 模型返回 NULL 尝试传递选定复选框的值
- java - Mavic 2 Enterprise 与 DJI GO 配合使用后不显示视频
- groovy - 如何在 Jmeter 中使用后处理器设置变量值并将其用于同一采样器的预处理器中?
- android - 将数据从 Room 返回到 ViewModel,然后使用来自 web 服务的新数据更新 ViewModel
- node.js - 节点 Js 将参数传递给“现成”回调
- javascript - 在 Dexie.js 中检查和添加缺失商店的最佳实践
- java - 通过 Spring Boot Keycloak 集成的 OAuth2 客户端凭据流