Получение истинного url файла после загрузки пользователем в django

вот проблема. в моем проекте пользователь собирается загрузить файл excel и сразу после этого приложение должно взять его и прочитать, используя pandas. файл загружен в media/projects/%Y/%m/%d/:

views.py:

if request.method == 'POST' and request.FILES['createdatabase']:
    user = request.user
    data = request.FILES['createdatabase']

    new = NewProject(
            user=user,
            data=data,
        )
    new.save()

models.py:

from django.db import models
from django.contrib.auth.models import User


class NewProject(models.Model):
    user = models.ForeignKey(User, on_delete=models.DO_NOTHING)
    data = models.FileField(blank=True, upload_to='projects/%Y/%m/%d/')
    u = models.TextField(blank=True)
    v = models.TextField(blank=True)
    w = models.TextField(blank=True)

u, v и w находятся в файле данных, который загружает пользователь, и приложение должно прочитать его. когда я хочу прочитать файл в pandas, используя метод read_excel(), ему нужен URL файла. использование data.url или data.path не работает, кажется, что он просто говорит имя файла или неправильный путь media/datafilename.xlsx. Истинный URL файла должен быть чем-то вроде media/2022/07/01/datafilename.xlsx. Кроме того, некоторые файлы могут иметь одинаковые имена, загруженные пользователями. поэтому Django просто добавляет к ним случайную строку. но data.url и data.path выводят основное имя файла, а не измененное.
Любая помощь будет оценена по достоинству.

Попробуйте вот это. https://docs.djangoproject.com/en/4.0/ref/models/fields/#django.db.models.FileField.upload_to

from datetime import datetime
from uuid import uuid4

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/projects/<year>/<month>/<day>/<filename>
    ext = filename.split(".")[-1]
    filename = "%s.%s" % (uuid4(), ext)
    today = datetime.now()
    today_path = today.strftime("%Y/%m/%d")
    return 'projects/{0}/{1}'.format(today_path, filename)

class NewProject(models.Model):
    data = models.FileField(upload_to=user_directory_path)

Для доступа к загруженному файлу,

project.data.path  # etc: '/media/projects/2022/07/02/4cc38320-556c-490a-90d5-f8834bf75275.xlsx'

Обратитесь https://docs.djangoproject.com/en/4.0/topics/files/#using-files-in-models

Вернуться на верх