Получение локального пути к файлу поля модели django

У меня вопрос по поводу моделей django. У меня есть модель 'model1'

class model1(models.Model):
dataset = models.FileField(upload_to='estimate/')

def column(self):
    arr = os.listdir('uploads/estimate')
    try:
        dframe = pd.read_csv(f'uploads/estimate/{arr[0]}')
        columns = dframe.columns
        columns_tuple = [tuple([x,x]) for x in columns]
        return columns_tuple
    except:
        return [('---','---')]

Эта модель1 в основном используется для загрузки файла csv, и я хочу получить имена столбцов для опций выпадающего списка для другой модели 'model2'.

class model2(models.Model):
    column = estimate()
    columns = column.column()
    open_column = models.CharField(max_length=50, choices = columns)
    high_column = models.CharField(max_length=50, choices = columns)
    low_column = models.CharField(max_length=50, choices = columns)
    close_column = models.CharField(max_length=50, choices = columns)
    volume_column = models.CharField(max_length=50, choices = columns)

Изначально каталог uploads/estimate пуст, поэтому model1.column() возвращает columns = [('---','---')], но когда я загружаю csv файл в model1, model2 не обновляет опцию выпадающего списка

Я не уверен, что есть другой способ, который может прочитать файл csv, поэтому я использую pd.read_csv, это потому что я не знаю, как использовать объект dataset, я пытался использовать self.dataset.name или self.dataset.path, чтобы получить путь к локальному файлу, но система сказала, что у него нет этих атрибутов. В итоге я использовал os.listdir, чтобы найти файл

Благодарю, если кто-нибудь может помочь мне решить эту проблему!

Вы можете добавить еще один FileSystemStorage, который должен использоваться только для полей вашего набора данных.

Попробуйте следующим образом:

class CustomStorages(FileSystemStorage):
    @cached_property
    def base_location(self): # override this where you dataset located
        return self._value_or_setting(self._location, settings.MEDIA_ROOT)

    @cached_property
    def location(self): # or override this where you dataset is located
        return os.path.abspath(self.base_location)

и прикрепите его к вашему FileFILED

class model1(models.Model):
    dataset = models.FileField(upload_to='estimate/', storage=CustomStorages)

Django FileSystemStorage является хранилищем по умолчанию, и по умолчанию его расположение берется из settings.py file.

Поэтому вам нужно определить пользовательские FileStorage, когда ваши данные находятся в разных местах.

После того, как вы настроите то, что было предложено выше.

и заполните поля файла следующим образом.

import os
os.rename('dataset.csv', 'newdataset.csv')
dataset = model1()
dataset.myfile.name = 'newdataset.csv'
dataset.save()
Вернуться на верх