Обновление FileField модели вручную в представлениях Django - PullRequest
1 голос
/ 03 апреля 2019

У меня есть файл 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()

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Вы должны создать файловый объект и затем прикрепить его к модели. Как это

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()
0 голосов
/ 03 апреля 2019

DataFrame.to_csv() возвращает None, если вы указываете путь к файлу для сохранения. Так что new_df это None.

Вам не нужно ничего делать после того, как вы сделали df.to_csv(project.file.name), файл уже изменен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...