Функция аннотирования со значением поля входного параметра - PullRequest
0 голосов
/ 20 марта 2020

У меня есть модель

class Audiopart(models.Model):
    book_id = models.ForeignKey(Audiobook, on_delete=models.CASCADE)
    part_title = models.CharField(max_length = 255)
    part_text = models.TextField(blank = True, null=True)
    part_reader = models.CharField(max_length = 255)
    filename = models.FileField(upload_to=get_upload_path, blank=True)

с функцией

def get_upload_path(instance, filename):
    return os.path.join(
        'audio',
        instance.book_id.folder,
        filename
    )

Я хочу загрузить файлы в каталог и сохранить в базе данных только имя файла (без пути). Но не нашел никакого способа сделать это.

Итак, я делаю функцию для очистки имени файла

def clear_filename(_filename):
    if '/' in _filename:
        _filename = _filename.split('/')[2]
    return _filename

Как я могу распечатать мои объекты с очищенным именем файла?

def audioparts(request, _book_id):
    all_audioparts = list(Audiopart.objects.filter(book_id=_book_id, published=True).values())
    return JsonResponse(all_audioparts, safe=False)

1 Ответ

1 голос
/ 20 марта 2020

Прежде всего, вы не понимаете, что такое FileField. Это на самом деле для хранения и доступа к самого файла. Таким образом, ваше поле должно называться не filename, а file или audio_file или что-то, что описывает файл .

Таким образом, когда у вас есть экземпляр AudioPart, например, part, вы можете напрямую получить доступ к файлу: part.filename - это файл в вашем коде, а не его имя.

Если вы хотите, чтобы метод обращался только к имени файла, задайте @property для вашей модели:

import os

class AudioPart(Model):
    file = FileField(...)
    ...

    @property
    def filename(self):
        return os.path.basename(self.file.name)

, тогда part.file - это файл, а part.filename - это имя файла. Таким образом, вы можете read() файл или вернуть его URL, чтобы люди могли загрузить его (part.file.url) или манипулировать им другими способами.

По вашему мнению, вы можете просто l oop поверх ваших файлов добавить имя файла в список перед возвратом JSON.

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