带有输入参数字段值的注释函数

问题描述 投票:0回答:1

我有模特

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)
python django database orm model
1个回答
1
投票
首先,您不了解FileField是什么。它实际上是用于存储

和访问文件本身。因此,您的字段不应称为filename,而应称为fileaudio_file或描述file的名称。

因此,当您有AudioPart的实例时,例如part,实际上您可以直接访问文件:part.filename是代码中的

file

,而不是名称。如果您只想使用一种方法来访问文件名,请在模型上定义一个@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)或以其他方式对其进行操作。

在您看来,您可以循环返回文件以将文件名添加到列表中,然后返回JSON。

© www.soinside.com 2019 - 2024. All rights reserved.