Получение локального пути к файлу поля модели 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()