Загрузка файла в базу данных django в определенном корне с разными папками каждый раз - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь загрузить файл в базу данных, но когда я хочу поставить функцию uoload и я хочу, чтобы эта функция сохраняла файл в корне с данными, которые пользователь отправляет в течение, например, года, курса,В разделе я получаю эту информацию и загруженный файл, который я хочу сохранить в этих подпапках, код, который я использую, хранит только данные в Media_root, но не в коврах. Как это сделать, чтобы хранить файлы вподпапка я хочу.В моем модельном документе я храню информацию о документе, такую ​​как автор, название и т. Д.

class File(models.Model):
     titulo_file=models.ForeignKey(Document,on_delete=models.CASCADE,null=True,verbose_       name='Título de la Tesis')
     file = models.FileField(null=True,blank=True, upload_to=generate_path)

Здесь функция, которую я использую для загрузки файла, Int работает только для сохранения файла впапка с тем же именем.

def generate_path(instance, filename):

      path =os.path.join(instance.file.name,filename)
      return path

На мой взгляд, после того, как пользователь отправил информацию, я использую os.path.join, который делает путь с информацией, отправленной следующим образом:

year/course/section

Я хочу отправить этот путь в мой generate_path и сохранить в этом месте файл, я пытался с сеансом, но он не работает, что мне делать?

models.py

class Year(models.Model):
    year_number=models.CharField(max_length=10,primary_key=True)

class Course(models.Model):
    name=models.CharField(max_length=50,primary_key=True)

class Section(models.Model):
    numberSection=models.IntegerField(null=True,blank=True)
    year = models.ForeignKey(Year, on_delete=models.CASCADE, null=True)
    course = models.ForeignKey(Course, on_delete=models.CASCADE)

thopic_documents=(
       ('CS','CS'),
       ('SE','SE'),
       ('IS','IS'),
       ('IT','IT'),
    )

class Document(models.Model):
     title=models.CharField(max_length=200,primary_key=True)
     thopic=models.CharField(max_length=50,choices=thopic_documents, default=None,null=True)

class Historial(models.Model):
      id_section=models.ForeignKey(Section,on_delete=models.CASCADE)
      title_document=models.ForeignKey(Document,on_delete=models.CASCADE,)

1 Ответ

0 голосов
/ 23 мая 2018

Чтобы получить год / курс / раздел, вы должны иметь возможность перемещаться от File до Section.Однако отношения «многие-многие», существующие между Document и Section до Historical, не позволяют понять, как вы это сделаете.Какой Historical вы бы выбрали?

Возможно, было бы лучше, если бы File был напрямую связан с Historical:

class File(models.Model):
     titulo_file=models.ForeignKey(Historical, on_delete=models.CASCADE,null=True,verbose_name='Título de la Tesis')
     file = models.FileField(null=True,blank=True, upload_to=generate_path)

Если бы это было так, вы могли бы реализоватьgenerate_path(), например:

def generate_path(instance, filename):
    section = instance.titulo_file.id_section
    year = section.year.year_number
    course = section.course.name
    return os.path.join(str(year), course, str(section.numberSection), filename)

Чтобы сделать то же самое с моделью в ее текущем состоянии, вам нужно будет сделать что-то вроде этого:

def generate_path(instance, filename):
    section = instance.titulo_file.historical_set.first().id_section
    year = section.year.year_number
    course = section.course.name
    return os.path.join(str(year), course, str(section.numberSection), filename)

В этом примере используется historical_set.first() чтобы получить первый Historical связанный Document.Возможно, это было бы хорошо, но в противном случае вам нужно знать, какой Historical использовать.

Если загружен файл с тем же именем и вы не хотите перезаписывать его, вы можете реализоватьсобственный хранилище :

from django.core.files.storage import FileSystemStorage

class UseExistingStorage(FileSystemStorage):

    def save(self, name, content, max_length=None):
        if not self.exists(name):
            return super().save(name, content, max_length)
        return name  # Don't save when the file exists, just return the name

Затем укажите UseExistingStorage из вашей File модели.

file = models.FileField(null=True,blank=True, upload_to=generate_path, storage=UseExistingStorage())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...